You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by al...@apache.org on 2014/02/11 18:35:56 UTC

[1/3] git commit: Replace TMBSC usage with ABSC and kill TMBSC

Updated Branches:
  refs/heads/trunk 5a3ffc090 -> 520457502


Replace TMBSC usage with ABSC and kill TMBSC


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/52045750
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/52045750
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/52045750

Branch: refs/heads/trunk
Commit: 5204575022030ce2e899edf36847fc3744f3d0ca
Parents: fb1c6b9
Author: Aleksey Yeschenko <al...@yeschenko.com>
Authored: Tue Feb 11 01:59:15 2014 +0300
Committer: Aleksey Yeschenko <al...@apache.org>
Committed: Tue Feb 11 20:35:31 2014 +0300

----------------------------------------------------------------------
 .../cql3/statements/DeleteStatement.java        |   2 +-
 .../cql3/statements/ModificationStatement.java  |   2 +-
 .../org/apache/cassandra/db/ColumnFamily.java   |   2 +-
 src/java/org/apache/cassandra/db/Mutation.java  |   2 +-
 .../apache/cassandra/db/RowIteratorFactory.java |   2 +-
 .../db/TreeMapBackedSortedColumns.java          | 140 -------------------
 .../cassandra/db/compaction/Scrubber.java       |   2 +-
 .../db/index/composites/CompositesSearcher.java |   2 +-
 .../cassandra/db/index/keys/KeysSearcher.java   |   2 +-
 .../io/sstable/SSTableSimpleUnsortedWriter.java |   4 +-
 .../io/sstable/SSTableSimpleWriter.java         |   2 +-
 .../apache/cassandra/tools/SSTableImport.java   |   2 +-
 .../apache/cassandra/tracing/TraceState.java    |   4 +-
 .../org/apache/cassandra/tracing/Tracing.java   |   2 +-
 .../cassandra/db/LongFlushMemtableTest.java     |   2 +-
 .../apache/cassandra/db/LongKeyspaceTest.java   |   2 +-
 .../cassandra/cache/CacheProviderTest.java      |   4 +-
 .../cassandra/db/ColumnFamilyStoreTest.java     |   4 +-
 .../apache/cassandra/db/ColumnFamilyTest.java   |  16 +--
 .../org/apache/cassandra/db/KeyspaceTest.java   |  26 ++--
 .../org/apache/cassandra/db/MultitableTest.java |   4 +-
 .../cassandra/db/RecoveryManager2Test.java      |   2 +-
 .../cassandra/db/RecoveryManager3Test.java      |   4 +-
 .../cassandra/db/RecoveryManagerTest.java       |   8 +-
 .../db/RecoveryManagerTruncateTest.java         |   2 +-
 test/unit/org/apache/cassandra/db/RowTest.java  |   8 +-
 .../unit/org/apache/cassandra/db/ScrubTest.java |   6 +-
 .../apache/cassandra/db/SerializationsTest.java |   4 +-
 .../cassandra/io/sstable/SSTableUtils.java      |   4 +-
 .../cassandra/service/RowResolverTest.java      |  26 ++--
 .../service/pager/AbstractQueryPagerTest.java   |   2 +-
 .../streaming/StreamingTransferTest.java        |   8 +-
 .../cassandra/tools/SSTableExportTest.java      |  14 +-
 .../cassandra/utils/EncodedStreamsTest.java     |   6 +-
 34 files changed, 91 insertions(+), 231 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/52045750/src/java/org/apache/cassandra/cql3/statements/DeleteStatement.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/statements/DeleteStatement.java b/src/java/org/apache/cassandra/cql3/statements/DeleteStatement.java
index d3dfe7c..7112b79 100644
--- a/src/java/org/apache/cassandra/cql3/statements/DeleteStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/DeleteStatement.java
@@ -46,7 +46,7 @@ public class DeleteStatement extends ModificationStatement
     public ColumnFamily updateForKey(ByteBuffer key, Composite prefix, UpdateParameters params)
     throws InvalidRequestException
     {
-        ColumnFamily cf = TreeMapBackedSortedColumns.factory.create(cfm);
+        ColumnFamily cf = ArrayBackedSortedColumns.factory.create(cfm);
         List<Operation> deletions = getOperations();
 
         if (prefix.size() < cfm.clusteringColumns().size() && !deletions.isEmpty())

http://git-wip-us.apache.org/repos/asf/cassandra/blob/52045750/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java b/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java
index f35690b..3775bde 100644
--- a/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java
@@ -585,7 +585,7 @@ public abstract class ModificationStatement implements CQLStatement, MeasurableF
                                   long now) throws InvalidRequestException
         {
             super(rowPrefix, now);
-            this.expected = TreeMapBackedSortedColumns.factory.create(cfm);
+            this.expected = ArrayBackedSortedColumns.factory.create(cfm);
 
             // When building the conditions, we should not use a TTL. It's not useful, and if a very low ttl (1 seconds) is used, it's possible
             // for it to expire before the actual build of the conditions which would break since we would then testing for the presence of tombstones.

http://git-wip-us.apache.org/repos/asf/cassandra/blob/52045750/src/java/org/apache/cassandra/db/ColumnFamily.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/ColumnFamily.java b/src/java/org/apache/cassandra/db/ColumnFamily.java
index 2bf91bf..66e8e33 100644
--- a/src/java/org/apache/cassandra/db/ColumnFamily.java
+++ b/src/java/org/apache/cassandra/db/ColumnFamily.java
@@ -284,7 +284,7 @@ public abstract class ColumnFamily implements Iterable<Cell>, IRowCacheEntry
     public ColumnFamily diff(ColumnFamily cfComposite)
     {
         assert cfComposite.id().equals(id());
-        ColumnFamily cfDiff = TreeMapBackedSortedColumns.factory.create(metadata);
+        ColumnFamily cfDiff = ArrayBackedSortedColumns.factory.create(metadata);
         cfDiff.delete(cfComposite.deletionInfo());
 
         // (don't need to worry about cfNew containing Columns that are shadowed by

http://git-wip-us.apache.org/repos/asf/cassandra/blob/52045750/src/java/org/apache/cassandra/db/Mutation.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/Mutation.java b/src/java/org/apache/cassandra/db/Mutation.java
index ef9b02d..bb7dcef 100644
--- a/src/java/org/apache/cassandra/db/Mutation.java
+++ b/src/java/org/apache/cassandra/db/Mutation.java
@@ -132,7 +132,7 @@ public class Mutation implements IMutation
         ColumnFamily cf = modifications.get(cfm.cfId);
         if (cf == null)
         {
-            cf = TreeMapBackedSortedColumns.factory.create(cfm);
+            cf = ArrayBackedSortedColumns.factory.create(cfm);
             modifications.put(cfm.cfId, cf);
         }
         return cf;

http://git-wip-us.apache.org/repos/asf/cassandra/blob/52045750/src/java/org/apache/cassandra/db/RowIteratorFactory.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/RowIteratorFactory.java b/src/java/org/apache/cassandra/db/RowIteratorFactory.java
index 7077944..31a2b38 100644
--- a/src/java/org/apache/cassandra/db/RowIteratorFactory.java
+++ b/src/java/org/apache/cassandra/db/RowIteratorFactory.java
@@ -82,7 +82,7 @@ public class RowIteratorFactory
             @Override
             protected void onKeyChange()
             {
-                this.returnCF = TreeMapBackedSortedColumns.factory.create(cfs.metadata);
+                this.returnCF = ArrayBackedSortedColumns.factory.create(cfs.metadata);
             }
 
             public void reduce(OnDiskAtomIterator current)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/52045750/src/java/org/apache/cassandra/db/TreeMapBackedSortedColumns.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/TreeMapBackedSortedColumns.java b/src/java/org/apache/cassandra/db/TreeMapBackedSortedColumns.java
deleted file mode 100644
index dadb021..0000000
--- a/src/java/org/apache/cassandra/db/TreeMapBackedSortedColumns.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * 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.util.Collection;
-import java.util.Iterator;
-import java.util.SortedMap;
-import java.util.SortedSet;
-import java.util.TreeMap;
-
-import org.apache.cassandra.config.CFMetaData;
-import org.apache.cassandra.db.composites.CellName;
-import org.apache.cassandra.db.filter.ColumnSlice;
-import org.apache.cassandra.utils.memory.HeapAllocator;
-
-public class TreeMapBackedSortedColumns extends AbstractThreadUnsafeSortedColumns
-{
-    private final TreeMap<CellName, Cell> map;
-
-    public static final ColumnFamily.Factory<TreeMapBackedSortedColumns> factory = new Factory<TreeMapBackedSortedColumns>()
-    {
-        public TreeMapBackedSortedColumns create(CFMetaData metadata, boolean insertReversed)
-        {
-            assert !insertReversed;
-            return new TreeMapBackedSortedColumns(metadata);
-        }
-    };
-
-    private TreeMapBackedSortedColumns(CFMetaData metadata)
-    {
-        super(metadata);
-        this.map = new TreeMap<>(metadata.comparator);
-    }
-
-    private TreeMapBackedSortedColumns(CFMetaData metadata, SortedMap<CellName, Cell> columns)
-    {
-        super(metadata);
-        this.map = new TreeMap<>(columns);
-    }
-
-    public ColumnFamily.Factory getFactory()
-    {
-        return factory;
-    }
-
-    public ColumnFamily cloneMe()
-    {
-        return new TreeMapBackedSortedColumns(metadata, map);
-    }
-
-    public boolean isInsertReversed()
-    {
-        return false;
-    }
-
-    /*
-     * If we find an old cell that has the same name
-     * the ask it to resolve itself else add the new cell
-    */
-    public void addColumn(Cell cell)
-    {
-        CellName name = cell.name();
-        // this is a slightly unusual way to structure this; a more natural way is shown in ThreadSafeSortedColumns,
-        // but TreeMap lacks putAbsent.  Rather than split it into a "get, then put" check, we do it as follows,
-        // which saves the extra "get" in the no-conflict case [for both normal and super columns],
-        // in exchange for a re-put in the SuperColumn case.
-        Cell oldCell = map.put(name, cell);
-        if (oldCell == null)
-            return;
-
-        // calculate reconciled col from old (existing) col and new col
-        map.put(name, cell.reconcile(oldCell, HeapAllocator.instance));
-    }
-
-    /**
-     * We need to go through each column in the column container and resolve it before adding
-     */
-    public void addAll(ColumnFamily cm)
-    {
-        delete(cm.deletionInfo());
-        for (Cell cell : cm)
-            addColumn(cell);
-    }
-
-    public Cell getColumn(CellName name)
-    {
-        return map.get(name);
-    }
-
-    public void clear()
-    {
-        setDeletionInfo(DeletionInfo.live());
-        map.clear();
-    }
-
-    public int getColumnCount()
-    {
-        return map.size();
-    }
-
-    public Collection<Cell> getSortedColumns()
-    {
-        return map.values();
-    }
-
-    public Collection<Cell> getReverseSortedColumns()
-    {
-        return map.descendingMap().values();
-    }
-
-    public SortedSet<CellName> getColumnNames()
-    {
-        return map.navigableKeySet();
-    }
-
-    public Iterator<Cell> iterator(ColumnSlice[] slices)
-    {
-        return new ColumnSlice.NavigableMapIterator(map, slices);
-    }
-
-    public Iterator<Cell> reverseIterator(ColumnSlice[] slices)
-    {
-        return new ColumnSlice.NavigableMapIterator(map.descendingMap(), slices);
-    }
-}

http://git-wip-us.apache.org/repos/asf/cassandra/blob/52045750/src/java/org/apache/cassandra/db/compaction/Scrubber.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/compaction/Scrubber.java b/src/java/org/apache/cassandra/db/compaction/Scrubber.java
index 32bef04..ff04723 100644
--- a/src/java/org/apache/cassandra/db/compaction/Scrubber.java
+++ b/src/java/org/apache/cassandra/db/compaction/Scrubber.java
@@ -300,7 +300,7 @@ public class Scrubber implements Closeable
         outputHandler.warn(String.format("Out of order row detected (%s found after %s)", key, prevKey));
         // adding atoms in sorted order is worst-case for TMBSC, but we shouldn't need to do this very often
         // and there's no sense in failing on mis-sorted cells when a TreeMap could safe us
-        ColumnFamily cf = atoms.getColumnFamily().cloneMeShallow(TreeMapBackedSortedColumns.factory, false);
+        ColumnFamily cf = atoms.getColumnFamily().cloneMeShallow(ArrayBackedSortedColumns.factory, false);
         while (atoms.hasNext())
         {
             OnDiskAtom atom = atoms.next();

http://git-wip-us.apache.org/repos/asf/cassandra/blob/52045750/src/java/org/apache/cassandra/db/index/composites/CompositesSearcher.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/index/composites/CompositesSearcher.java b/src/java/org/apache/cassandra/db/index/composites/CompositesSearcher.java
index b441ff1..fad3d50 100644
--- a/src/java/org/apache/cassandra/db/index/composites/CompositesSearcher.java
+++ b/src/java/org/apache/cassandra/db/index/composites/CompositesSearcher.java
@@ -273,7 +273,7 @@ public class CompositesSearcher extends SecondaryIndexSearcher
                             continue;
 
                         if (data == null)
-                            data = TreeMapBackedSortedColumns.factory.create(baseCfs.metadata);
+                            data = ArrayBackedSortedColumns.factory.create(baseCfs.metadata);
                         data.resolve(newData);
                         columnsCount += dataFilter.lastCounted();
                     }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/52045750/src/java/org/apache/cassandra/db/index/keys/KeysSearcher.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/index/keys/KeysSearcher.java b/src/java/org/apache/cassandra/db/index/keys/KeysSearcher.java
index f08ba4d..ce5fe30 100644
--- a/src/java/org/apache/cassandra/db/index/keys/KeysSearcher.java
+++ b/src/java/org/apache/cassandra/db/index/keys/KeysSearcher.java
@@ -171,7 +171,7 @@ public class KeysSearcher extends SecondaryIndexSearcher
                         ColumnFamily data = baseCfs.getColumnFamily(new QueryFilter(dk, baseCfs.name, filter.columnFilter(lastSeenKey.toByteBuffer()), filter.timestamp));
                         // While the column family we'll get in the end should contains the primary clause cell, the initialFilter may not have found it and can thus be null
                         if (data == null)
-                            data = TreeMapBackedSortedColumns.factory.create(baseCfs.metadata);
+                            data = ArrayBackedSortedColumns.factory.create(baseCfs.metadata);
 
                         // as in CFS.filter - extend the filter to ensure we include the columns
                         // from the index expressions, just in case they weren't included in the initialFilter

http://git-wip-us.apache.org/repos/asf/cassandra/blob/52045750/src/java/org/apache/cassandra/io/sstable/SSTableSimpleUnsortedWriter.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/io/sstable/SSTableSimpleUnsortedWriter.java b/src/java/org/apache/cassandra/io/sstable/SSTableSimpleUnsortedWriter.java
index c8c7277..38fbece 100644
--- a/src/java/org/apache/cassandra/io/sstable/SSTableSimpleUnsortedWriter.java
+++ b/src/java/org/apache/cassandra/io/sstable/SSTableSimpleUnsortedWriter.java
@@ -27,9 +27,9 @@ import java.util.concurrent.SynchronousQueue;
 import com.google.common.base.Throwables;
 
 import org.apache.cassandra.config.CFMetaData;
+import org.apache.cassandra.db.ArrayBackedSortedColumns;
 import org.apache.cassandra.db.ColumnFamily;
 import org.apache.cassandra.db.DecoratedKey;
-import org.apache.cassandra.db.TreeMapBackedSortedColumns;
 import org.apache.cassandra.db.marshal.AbstractType;
 import org.apache.cassandra.dht.IPartitioner;
 import org.apache.cassandra.io.compress.CompressionParameters;
@@ -111,7 +111,7 @@ public class SSTableSimpleUnsortedWriter extends AbstractSSTableSimpleWriter
         // If the CF already exist in memory, we'll just continue adding to it
         if (previous == null)
         {
-            previous = TreeMapBackedSortedColumns.factory.create(metadata);
+            previous = ArrayBackedSortedColumns.factory.create(metadata);
             buffer.put(currentKey, previous);
         }
         else

http://git-wip-us.apache.org/repos/asf/cassandra/blob/52045750/src/java/org/apache/cassandra/io/sstable/SSTableSimpleWriter.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/io/sstable/SSTableSimpleWriter.java b/src/java/org/apache/cassandra/io/sstable/SSTableSimpleWriter.java
index 054d780..87c8e33 100644
--- a/src/java/org/apache/cassandra/io/sstable/SSTableSimpleWriter.java
+++ b/src/java/org/apache/cassandra/io/sstable/SSTableSimpleWriter.java
@@ -87,6 +87,6 @@ public class SSTableSimpleWriter extends AbstractSSTableSimpleWriter
 
     protected ColumnFamily getColumnFamily()
     {
-        return TreeMapBackedSortedColumns.factory.create(metadata);
+        return ArrayBackedSortedColumns.factory.create(metadata);
     }
 }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/52045750/src/java/org/apache/cassandra/tools/SSTableImport.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/tools/SSTableImport.java b/src/java/org/apache/cassandra/tools/SSTableImport.java
index 2cb284e..2a516a4 100644
--- a/src/java/org/apache/cassandra/tools/SSTableImport.java
+++ b/src/java/org/apache/cassandra/tools/SSTableImport.java
@@ -345,7 +345,7 @@ public class SSTableImport
      */
     public int importJson(String jsonFile, String keyspace, String cf, String ssTablePath) throws IOException
     {
-        ColumnFamily columnFamily = TreeMapBackedSortedColumns.factory.create(keyspace, cf);
+        ColumnFamily columnFamily = ArrayBackedSortedColumns.factory.create(keyspace, cf);
         IPartitioner<?> partitioner = DatabaseDescriptor.getPartitioner();
 
         int importedKeys = (isSorted) ? importSorted(jsonFile, columnFamily, ssTablePath, partitioner)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/52045750/src/java/org/apache/cassandra/tracing/TraceState.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/tracing/TraceState.java b/src/java/org/apache/cassandra/tracing/TraceState.java
index de8ca44..62eb891 100644
--- a/src/java/org/apache/cassandra/tracing/TraceState.java
+++ b/src/java/org/apache/cassandra/tracing/TraceState.java
@@ -28,9 +28,9 @@ import org.slf4j.helpers.MessageFormatter;
 import org.apache.cassandra.concurrent.Stage;
 import org.apache.cassandra.concurrent.StageManager;
 import org.apache.cassandra.config.CFMetaData;
+import org.apache.cassandra.db.ArrayBackedSortedColumns;
 import org.apache.cassandra.db.ColumnFamily;
 import org.apache.cassandra.db.Mutation;
-import org.apache.cassandra.db.TreeMapBackedSortedColumns;
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.UUIDGen;
@@ -94,7 +94,7 @@ public class TraceState
             public void runMayThrow()
             {
                 CFMetaData cfMeta = CFMetaData.TraceEventsCf;
-                ColumnFamily cf = TreeMapBackedSortedColumns.factory.create(cfMeta);
+                ColumnFamily cf = ArrayBackedSortedColumns.factory.create(cfMeta);
                 Tracing.addColumn(cf, Tracing.buildName(cfMeta, eventId, ByteBufferUtil.bytes("activity")), message);
                 Tracing.addColumn(cf, Tracing.buildName(cfMeta, eventId, ByteBufferUtil.bytes("source")), FBUtilities.getBroadcastAddress());
                 if (elapsed >= 0)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/52045750/src/java/org/apache/cassandra/tracing/Tracing.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/tracing/Tracing.java b/src/java/org/apache/cassandra/tracing/Tracing.java
index f22f273..ad63bd8 100644
--- a/src/java/org/apache/cassandra/tracing/Tracing.java
+++ b/src/java/org/apache/cassandra/tracing/Tracing.java
@@ -203,7 +203,7 @@ public class Tracing
             public void run()
             {
                 CFMetaData cfMeta = CFMetaData.TraceSessionsCf;
-                ColumnFamily cf = TreeMapBackedSortedColumns.factory.create(cfMeta);
+                ColumnFamily cf = ArrayBackedSortedColumns.factory.create(cfMeta);
                 addColumn(cf, buildName(cfMeta, "coordinator"), FBUtilities.getBroadcastAddress());
                 addParameterColumns(cf, parameters);
                 addColumn(cf, buildName(cfMeta, "request"), request);

http://git-wip-us.apache.org/repos/asf/cassandra/blob/52045750/test/long/org/apache/cassandra/db/LongFlushMemtableTest.java
----------------------------------------------------------------------
diff --git a/test/long/org/apache/cassandra/db/LongFlushMemtableTest.java b/test/long/org/apache/cassandra/db/LongFlushMemtableTest.java
index e7bfe30..ba59404 100644
--- a/test/long/org/apache/cassandra/db/LongFlushMemtableTest.java
+++ b/test/long/org/apache/cassandra/db/LongFlushMemtableTest.java
@@ -51,7 +51,7 @@ public class LongFlushMemtableTest extends SchemaLoader
             for (int i = 0; i < 100; i++)
             {
                 Mutation rm = new Mutation("Keyspace1", ByteBufferUtil.bytes("key" + j));
-                ColumnFamily cf = TreeMapBackedSortedColumns.factory.create("Keyspace1", "_CF" + i);
+                ColumnFamily cf = ArrayBackedSortedColumns.factory.create("Keyspace1", "_CF" + i);
                 // don't cheat by allocating this outside of the loop; that defeats the purpose of deliberately using lots of memory
                 ByteBuffer value = ByteBuffer.allocate(100000);
                 cf.addColumn(new Cell(Util.cellname("c"), value));

http://git-wip-us.apache.org/repos/asf/cassandra/blob/52045750/test/long/org/apache/cassandra/db/LongKeyspaceTest.java
----------------------------------------------------------------------
diff --git a/test/long/org/apache/cassandra/db/LongKeyspaceTest.java b/test/long/org/apache/cassandra/db/LongKeyspaceTest.java
index d610efa..327ff47 100644
--- a/test/long/org/apache/cassandra/db/LongKeyspaceTest.java
+++ b/test/long/org/apache/cassandra/db/LongKeyspaceTest.java
@@ -38,7 +38,7 @@ public class LongKeyspaceTest extends SchemaLoader
         for (int i = 1; i < 5000; i += 100)
         {
             Mutation rm = new Mutation("Keyspace1", Util.dk("key" + i).key);
-            ColumnFamily cf = TreeMapBackedSortedColumns.factory.create("Keyspace1", "Standard1");
+            ColumnFamily cf = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1");
             for (int j = 0; j < i; j++)
                 cf.addColumn(column("c" + j, "v" + j, 1L));
             rm.add(cf);

http://git-wip-us.apache.org/repos/asf/cassandra/blob/52045750/test/unit/org/apache/cassandra/cache/CacheProviderTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/cache/CacheProviderTest.java b/test/unit/org/apache/cassandra/cache/CacheProviderTest.java
index 849c30c..71d4f80 100644
--- a/test/unit/org/apache/cassandra/cache/CacheProviderTest.java
+++ b/test/unit/org/apache/cassandra/cache/CacheProviderTest.java
@@ -29,10 +29,10 @@ import java.util.UUID;
 import org.junit.Test;
 
 import org.apache.cassandra.SchemaLoader;
+import org.apache.cassandra.db.ArrayBackedSortedColumns;
 import org.apache.cassandra.db.ColumnFamily;
 
 import com.googlecode.concurrentlinkedhashmap.Weighers;
-import org.apache.cassandra.db.TreeMapBackedSortedColumns;
 
 import static org.apache.cassandra.Util.column;
 import static org.junit.Assert.*;
@@ -100,7 +100,7 @@ public class CacheProviderTest extends SchemaLoader
 
     private ColumnFamily createCF()
     {
-        ColumnFamily cf = TreeMapBackedSortedColumns.factory.create(keyspaceName, cfName);
+        ColumnFamily cf = ArrayBackedSortedColumns.factory.create(keyspaceName, cfName);
         cf.addColumn(column("vijay", "great", 1));
         cf.addColumn(column("awesome", "vijay", 1));
         return cf;

http://git-wip-us.apache.org/repos/asf/cassandra/blob/52045750/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java b/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java
index 7bc0256..5c71d9b 100644
--- a/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java
+++ b/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java
@@ -774,7 +774,7 @@ public class ColumnFamilyStoreTest extends SchemaLoader
 
     private static void putColsSuper(ColumnFamilyStore cfs, DecoratedKey key, ByteBuffer scfName, Cell... cols) throws Throwable
     {
-        ColumnFamily cf = TreeMapBackedSortedColumns.factory.create(cfs.keyspace.getName(), cfs.name);
+        ColumnFamily cf = ArrayBackedSortedColumns.factory.create(cfs.keyspace.getName(), cfs.name);
         for (Cell col : cols)
             cf.addColumn(col.withUpdatedName(CellNames.compositeDense(scfName, col.name().toByteBuffer())));
         Mutation rm = new Mutation(cfs.keyspace.getName(), key.key, cf);
@@ -783,7 +783,7 @@ public class ColumnFamilyStoreTest extends SchemaLoader
 
     private static void putColsStandard(ColumnFamilyStore cfs, DecoratedKey key, Cell... cols) throws Throwable
     {
-        ColumnFamily cf = TreeMapBackedSortedColumns.factory.create(cfs.keyspace.getName(), cfs.name);
+        ColumnFamily cf = ArrayBackedSortedColumns.factory.create(cfs.keyspace.getName(), cfs.name);
         for (Cell col : cols)
             cf.addColumn(col);
         Mutation rm = new Mutation(cfs.keyspace.getName(), key.key, cf);

http://git-wip-us.apache.org/repos/asf/cassandra/blob/52045750/test/unit/org/apache/cassandra/db/ColumnFamilyTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/db/ColumnFamilyTest.java b/test/unit/org/apache/cassandra/db/ColumnFamilyTest.java
index ae2a461..693a670 100644
--- a/test/unit/org/apache/cassandra/db/ColumnFamilyTest.java
+++ b/test/unit/org/apache/cassandra/db/ColumnFamilyTest.java
@@ -48,7 +48,7 @@ public class ColumnFamilyTest extends SchemaLoader
     {
         ColumnFamily cf;
 
-        cf = TreeMapBackedSortedColumns.factory.create("Keyspace1", "Standard1");
+        cf = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1");
         cf.addColumn(column("C", "v", 1));
         DataOutputBuffer bufOut = new DataOutputBuffer();
         ColumnFamily.serializer.serialize(cf, bufOut, version);
@@ -72,7 +72,7 @@ public class ColumnFamilyTest extends SchemaLoader
         }
 
         // write
-        cf = TreeMapBackedSortedColumns.factory.create("Keyspace1", "Standard1");
+        cf = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1");
         DataOutputBuffer bufOut = new DataOutputBuffer();
         for (String cName : map.navigableKeySet())
         {
@@ -94,7 +94,7 @@ public class ColumnFamilyTest extends SchemaLoader
     @Test
     public void testGetColumnCount()
     {
-        ColumnFamily cf = TreeMapBackedSortedColumns.factory.create("Keyspace1", "Standard1");
+        ColumnFamily cf = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1");
 
         cf.addColumn(column("col1", "", 1));
         cf.addColumn(column("col2", "", 2));
@@ -107,7 +107,7 @@ public class ColumnFamilyTest extends SchemaLoader
     @Test
     public void testTimestamp()
     {
-        ColumnFamily cf = TreeMapBackedSortedColumns.factory.create("Keyspace1", "Standard1");
+        ColumnFamily cf = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1");
 
         cf.addColumn(column("col1", "val1", 2));
         cf.addColumn(column("col1", "val2", 2)); // same timestamp, new value
@@ -119,9 +119,9 @@ public class ColumnFamilyTest extends SchemaLoader
     @Test
     public void testMergeAndAdd()
     {
-        ColumnFamily cf_new = TreeMapBackedSortedColumns.factory.create("Keyspace1", "Standard1");
-        ColumnFamily cf_old = TreeMapBackedSortedColumns.factory.create("Keyspace1", "Standard1");
-        ColumnFamily cf_result = TreeMapBackedSortedColumns.factory.create("Keyspace1", "Standard1");
+        ColumnFamily cf_new = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1");
+        ColumnFamily cf_old = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1");
+        ColumnFamily cf_result = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1");
         ByteBuffer val = ByteBufferUtil.bytes("sample value");
         ByteBuffer val2 = ByteBufferUtil.bytes("x value ");
 
@@ -157,7 +157,7 @@ public class ColumnFamilyTest extends SchemaLoader
         long timestamp = System.currentTimeMillis();
         int localDeletionTime = (int) (System.currentTimeMillis() / 1000);
 
-        ColumnFamily cf = TreeMapBackedSortedColumns.factory.create("Keyspace1", "Standard1");
+        ColumnFamily cf = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1");
         cf.delete(new DeletionInfo(timestamp, localDeletionTime));
         ColumnStats stats = cf.getColumnStats();
         assertEquals(timestamp, stats.maxTimestamp);

http://git-wip-us.apache.org/repos/asf/cassandra/blob/52045750/test/unit/org/apache/cassandra/db/KeyspaceTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/db/KeyspaceTest.java b/test/unit/org/apache/cassandra/db/KeyspaceTest.java
index ef69518..caaff65 100644
--- a/test/unit/org/apache/cassandra/db/KeyspaceTest.java
+++ b/test/unit/org/apache/cassandra/db/KeyspaceTest.java
@@ -63,7 +63,7 @@ public class KeyspaceTest extends SchemaLoader
         final Keyspace keyspace = Keyspace.open("Keyspace2");
         final ColumnFamilyStore cfStore = keyspace.getColumnFamilyStore("Standard3");
 
-        ColumnFamily cf = TreeMapBackedSortedColumns.factory.create("Keyspace2", "Standard3");
+        ColumnFamily cf = ArrayBackedSortedColumns.factory.create("Keyspace2", "Standard3");
         cf.addColumn(column("col1","val1", 1L));
         Mutation rm = new Mutation("Keyspace2", TEST_KEY.key, cf);
         rm.apply();
@@ -93,7 +93,7 @@ public class KeyspaceTest extends SchemaLoader
         final Keyspace keyspace = Keyspace.open("Keyspace1");
         final ColumnFamilyStore cfStore = keyspace.getColumnFamilyStore("Standard1");
 
-        ColumnFamily cf = TreeMapBackedSortedColumns.factory.create("Keyspace1", "Standard1");
+        ColumnFamily cf = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1");
         cf.addColumn(column("col1","val1", 1L));
         cf.addColumn(column("col2","val2", 1L));
         cf.addColumn(column("col3","val3", 1L));
@@ -122,7 +122,7 @@ public class KeyspaceTest extends SchemaLoader
     	DecoratedKey key = TEST_SLICE_KEY;
     	Keyspace keyspace = Keyspace.open("Keyspace1");
         ColumnFamilyStore cfStore = keyspace.getColumnFamilyStore("Standard1");
-        ColumnFamily cf = TreeMapBackedSortedColumns.factory.create("Keyspace1", "Standard1");
+        ColumnFamily cf = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1");
         // First write "a", "b", "c"
         cf.addColumn(column("a", "val1", 1L));
         cf.addColumn(column("b", "val2", 1L));
@@ -144,7 +144,7 @@ public class KeyspaceTest extends SchemaLoader
     public void testGetSliceNoMatch() throws Throwable
     {
         Keyspace keyspace = Keyspace.open("Keyspace1");
-        ColumnFamily cf = TreeMapBackedSortedColumns.factory.create("Keyspace1", "Standard2");
+        ColumnFamily cf = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard2");
         cf.addColumn(column("col1", "val1", 1));
         Mutation rm = new Mutation("Keyspace1", ByteBufferUtil.bytes("row1000"), cf);
         rm.apply();
@@ -168,7 +168,7 @@ public class KeyspaceTest extends SchemaLoader
         final DecoratedKey ROW = Util.dk("row4");
         final NumberFormat fmt = new DecimalFormat("000");
 
-        ColumnFamily cf = TreeMapBackedSortedColumns.factory.create("Keyspace1", "Standard1");
+        ColumnFamily cf = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1");
         // at this rate, we're getting 78-79 cos/block, assuming the blocks are set to be about 4k.
         // so if we go to 300, we'll get at least 4 blocks, which is plenty for testing.
         for (int i = 0; i < 300; i++)
@@ -226,7 +226,7 @@ public class KeyspaceTest extends SchemaLoader
 
         for (int i = 0; i < 10; i++)
         {
-            ColumnFamily cf = TreeMapBackedSortedColumns.factory.create("Keyspace1", "StandardLong1");
+            ColumnFamily cf = ArrayBackedSortedColumns.factory.create("Keyspace1", "StandardLong1");
             cf.addColumn(new Cell(cellname((long)i), ByteBufferUtil.EMPTY_BYTE_BUFFER, 0));
             Mutation rm = new Mutation("Keyspace1", ROW.key, cf);
             rm.apply();
@@ -236,7 +236,7 @@ public class KeyspaceTest extends SchemaLoader
 
         for (int i = 10; i < 20; i++)
         {
-            ColumnFamily cf = TreeMapBackedSortedColumns.factory.create("Keyspace1", "StandardLong1");
+            ColumnFamily cf = ArrayBackedSortedColumns.factory.create("Keyspace1", "StandardLong1");
             cf.addColumn(new Cell(cellname((long)i), ByteBufferUtil.EMPTY_BYTE_BUFFER, 0));
             Mutation rm = new Mutation("Keyspace1", ROW.key, cf);
             rm.apply();
@@ -269,7 +269,7 @@ public class KeyspaceTest extends SchemaLoader
         final ColumnFamilyStore cfStore = keyspace.getColumnFamilyStore("Standard1");
         final DecoratedKey ROW = Util.dk("row1");
 
-        ColumnFamily cf = TreeMapBackedSortedColumns.factory.create("Keyspace1", "Standard1");
+        ColumnFamily cf = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1");
         cf.addColumn(column("col1", "val1", 1L));
         cf.addColumn(column("col3", "val3", 1L));
         cf.addColumn(column("col4", "val4", 1L));
@@ -324,7 +324,7 @@ public class KeyspaceTest extends SchemaLoader
         final ColumnFamilyStore cfStore = keyspace.getColumnFamilyStore("Standard1");
         final DecoratedKey ROW = Util.dk("row5");
 
-        ColumnFamily cf = TreeMapBackedSortedColumns.factory.create("Keyspace1", "Standard1");
+        ColumnFamily cf = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1");
         cf.addColumn(column("col1", "val1", 1L));
         cf.addColumn(expiringColumn("col2", "val2", 1L, 60)); // long enough not to be tombstoned
         cf.addColumn(column("col3", "val3", 1L));
@@ -358,7 +358,7 @@ public class KeyspaceTest extends SchemaLoader
         final ColumnFamilyStore cfStore = keyspace.getColumnFamilyStore("Standard1");
         final DecoratedKey ROW = Util.dk("row2");
 
-        ColumnFamily cf = TreeMapBackedSortedColumns.factory.create("Keyspace1", "Standard1");
+        ColumnFamily cf = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1");
         cf.addColumn(column("col1", "val1", 1L));
         cf.addColumn(column("col2", "val2", 1L));
         cf.addColumn(column("col3", "val3", 1L));
@@ -369,7 +369,7 @@ public class KeyspaceTest extends SchemaLoader
         rm.apply();
         cfStore.forceBlockingFlush();
 
-        cf = TreeMapBackedSortedColumns.factory.create("Keyspace1", "Standard1");
+        cf = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1");
         cf.addColumn(column("col1", "valx", 2L));
         cf.addColumn(column("col2", "valx", 2L));
         cf.addColumn(column("col3", "valx", 2L));
@@ -406,7 +406,7 @@ public class KeyspaceTest extends SchemaLoader
         Keyspace keyspace = Keyspace.open("Keyspace1");
         ColumnFamilyStore cfStore = keyspace.getColumnFamilyStore("Standard1");
         DecoratedKey key = Util.dk("row3");
-        ColumnFamily cf = TreeMapBackedSortedColumns.factory.create("Keyspace1", "Standard1");
+        ColumnFamily cf = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1");
         for (int i = 1000; i < 2000; i++)
             cf.addColumn(column("col" + i, ("v" + i), 1L));
         Mutation rm = new Mutation("Keyspace1", key.key, cf);
@@ -437,7 +437,7 @@ public class KeyspaceTest extends SchemaLoader
         DecoratedKey key = Util.dk("row_maxmin");
         for (int j = 0; j < 10; j++)
         {
-            ColumnFamily cf = TreeMapBackedSortedColumns.factory.create("Keyspace1", "Standard1");
+            ColumnFamily cf = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1");
             for (int i = 1000 + (j*100); i < 1000 + ((j+1)*100); i++)
             {
                 cf.addColumn(column("col" + i, ("v" + i), i));

http://git-wip-us.apache.org/repos/asf/cassandra/blob/52045750/test/unit/org/apache/cassandra/db/MultitableTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/db/MultitableTest.java b/test/unit/org/apache/cassandra/db/MultitableTest.java
index dc8208e..16f9532 100644
--- a/test/unit/org/apache/cassandra/db/MultitableTest.java
+++ b/test/unit/org/apache/cassandra/db/MultitableTest.java
@@ -43,12 +43,12 @@ public class MultitableTest extends SchemaLoader
         DecoratedKey dk = Util.dk("keymulti");
         ColumnFamily cf;
 
-        cf = TreeMapBackedSortedColumns.factory.create("Keyspace1", "Standard1");
+        cf = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1");
         cf.addColumn(column("col1", "val1", 1L));
         rm = new Mutation("Keyspace1", dk.key, cf);
         rm.apply();
 
-        cf = TreeMapBackedSortedColumns.factory.create("Keyspace2", "Standard1");
+        cf = ArrayBackedSortedColumns.factory.create("Keyspace2", "Standard1");
         cf.addColumn(column("col2", "val2", 1L));
         rm = new Mutation("Keyspace2", dk.key, cf);
         rm.apply();

http://git-wip-us.apache.org/repos/asf/cassandra/blob/52045750/test/unit/org/apache/cassandra/db/RecoveryManager2Test.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/db/RecoveryManager2Test.java b/test/unit/org/apache/cassandra/db/RecoveryManager2Test.java
index 8e4145c..919d7e9 100644
--- a/test/unit/org/apache/cassandra/db/RecoveryManager2Test.java
+++ b/test/unit/org/apache/cassandra/db/RecoveryManager2Test.java
@@ -71,7 +71,7 @@ public class RecoveryManager2Test extends SchemaLoader
 
     private void insertRow(String cfname, String key) throws IOException
     {
-        ColumnFamily cf = TreeMapBackedSortedColumns.factory.create("Keyspace1", cfname);
+        ColumnFamily cf = ArrayBackedSortedColumns.factory.create("Keyspace1", cfname);
         cf.addColumn(column("col1", "val1", 1L));
         Mutation rm = new Mutation("Keyspace1", ByteBufferUtil.bytes(key), cf);
         rm.apply();

http://git-wip-us.apache.org/repos/asf/cassandra/blob/52045750/test/unit/org/apache/cassandra/db/RecoveryManager3Test.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/db/RecoveryManager3Test.java b/test/unit/org/apache/cassandra/db/RecoveryManager3Test.java
index be11967..6f697fd 100644
--- a/test/unit/org/apache/cassandra/db/RecoveryManager3Test.java
+++ b/test/unit/org/apache/cassandra/db/RecoveryManager3Test.java
@@ -48,12 +48,12 @@ public class RecoveryManager3Test extends SchemaLoader
         DecoratedKey dk = Util.dk("keymulti");
         ColumnFamily cf;
 
-        cf = TreeMapBackedSortedColumns.factory.create("Keyspace1", "Standard1");
+        cf = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1");
         cf.addColumn(column("col1", "val1", 1L));
         rm = new Mutation("Keyspace1", dk.key, cf);
         rm.apply();
 
-        cf = TreeMapBackedSortedColumns.factory.create("Keyspace2", "Standard3");
+        cf = ArrayBackedSortedColumns.factory.create("Keyspace2", "Standard3");
         cf.addColumn(column("col2", "val2", 1L));
         rm = new Mutation("Keyspace2", dk.key, cf);
         rm.apply();

http://git-wip-us.apache.org/repos/asf/cassandra/blob/52045750/test/unit/org/apache/cassandra/db/RecoveryManagerTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/db/RecoveryManagerTest.java b/test/unit/org/apache/cassandra/db/RecoveryManagerTest.java
index ce0d2b9..dc4d488 100644
--- a/test/unit/org/apache/cassandra/db/RecoveryManagerTest.java
+++ b/test/unit/org/apache/cassandra/db/RecoveryManagerTest.java
@@ -52,12 +52,12 @@ public class RecoveryManagerTest extends SchemaLoader
         DecoratedKey dk = Util.dk("keymulti");
         ColumnFamily cf;
 
-        cf = TreeMapBackedSortedColumns.factory.create("Keyspace1", "Standard1");
+        cf = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1");
         cf.addColumn(column("col1", "val1", 1L));
         rm = new Mutation("Keyspace1", dk.key, cf);
         rm.apply();
 
-        cf = TreeMapBackedSortedColumns.factory.create("Keyspace2", "Standard3");
+        cf = ArrayBackedSortedColumns.factory.create("Keyspace2", "Standard3");
         cf.addColumn(column("col2", "val2", 1L));
         rm = new Mutation("Keyspace2", dk.key, cf);
         rm.apply();
@@ -83,7 +83,7 @@ public class RecoveryManagerTest extends SchemaLoader
 
         for (int i = 0; i < 10; ++i)
         {
-            cf = TreeMapBackedSortedColumns.factory.create("Keyspace1", "Counter1");
+            cf = ArrayBackedSortedColumns.factory.create("Keyspace1", "Counter1");
             cf.addColumn(CounterCell.createLocal(cellname("col"), 1L, 1L, Long.MIN_VALUE));
             rm = new Mutation("Keyspace1", dk.key, cf);
             rm.apply();
@@ -114,7 +114,7 @@ public class RecoveryManagerTest extends SchemaLoader
         for (int i = 0; i < 10; ++i)
         {
             long ts = TimeUnit.MILLISECONDS.toMicros(timeMS + (i * 1000));
-            ColumnFamily cf = TreeMapBackedSortedColumns.factory.create("Keyspace1", "Standard1");
+            ColumnFamily cf = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1");
             cf.addColumn(column("name-" + i, "value", ts));
             Mutation rm = new Mutation("Keyspace1", dk.key, cf);
             rm.apply();

http://git-wip-us.apache.org/repos/asf/cassandra/blob/52045750/test/unit/org/apache/cassandra/db/RecoveryManagerTruncateTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/db/RecoveryManagerTruncateTest.java b/test/unit/org/apache/cassandra/db/RecoveryManagerTruncateTest.java
index 16ab04a..bd39142 100644
--- a/test/unit/org/apache/cassandra/db/RecoveryManagerTruncateTest.java
+++ b/test/unit/org/apache/cassandra/db/RecoveryManagerTruncateTest.java
@@ -46,7 +46,7 @@ public class RecoveryManagerTruncateTest extends SchemaLoader
 		ColumnFamily cf;
 
 		// add a single cell
-        cf = TreeMapBackedSortedColumns.factory.create("Keyspace1", "Standard1");
+        cf = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1");
 		cf.addColumn(column("col1", "val1", 1L));
         rm = new Mutation("Keyspace1", ByteBufferUtil.bytes("keymulti"), cf);
 		rm.apply();

http://git-wip-us.apache.org/repos/asf/cassandra/blob/52045750/test/unit/org/apache/cassandra/db/RowTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/db/RowTest.java b/test/unit/org/apache/cassandra/db/RowTest.java
index d5d22c0..4a686c5 100644
--- a/test/unit/org/apache/cassandra/db/RowTest.java
+++ b/test/unit/org/apache/cassandra/db/RowTest.java
@@ -37,10 +37,10 @@ public class RowTest extends SchemaLoader
     @Test
     public void testDiffColumnFamily()
     {
-        ColumnFamily cf1 = TreeMapBackedSortedColumns.factory.create("Keyspace1", "Standard1");
+        ColumnFamily cf1 = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1");
         cf1.addColumn(column("one", "onev", 0));
 
-        ColumnFamily cf2 = TreeMapBackedSortedColumns.factory.create("Keyspace1", "Standard1");
+        ColumnFamily cf2 = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1");
         DeletionInfo delInfo = new DeletionInfo(0, 0);
         cf2.delete(delInfo);
 
@@ -52,10 +52,10 @@ public class RowTest extends SchemaLoader
     @Test
     public void testResolve()
     {
-        ColumnFamily cf1 = TreeMapBackedSortedColumns.factory.create("Keyspace1", "Standard1");
+        ColumnFamily cf1 = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1");
         cf1.addColumn(column("one", "A", 0));
 
-        ColumnFamily cf2 = TreeMapBackedSortedColumns.factory.create("Keyspace1", "Standard1");
+        ColumnFamily cf2 = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1");
         cf2.addColumn(column("one", "B", 1));
         cf2.addColumn(column("two", "C", 1));
 

http://git-wip-us.apache.org/repos/asf/cassandra/blob/52045750/test/unit/org/apache/cassandra/db/ScrubTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/db/ScrubTest.java b/test/unit/org/apache/cassandra/db/ScrubTest.java
index d8ab9ff..01f3f6b 100644
--- a/test/unit/org/apache/cassandra/db/ScrubTest.java
+++ b/test/unit/org/apache/cassandra/db/ScrubTest.java
@@ -135,7 +135,7 @@ public class ScrubTest extends SchemaLoader
         ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(CF3);
         cfs.clearUnsafe();
 
-        ColumnFamily cf = TreeMapBackedSortedColumns.factory.create(KEYSPACE, CF3);
+        ColumnFamily cf = ArrayBackedSortedColumns.factory.create(KEYSPACE, CF3);
         cf.delete(new DeletionInfo(0, 1)); // expired tombstone
         Mutation rm = new Mutation(KEYSPACE, ByteBufferUtil.bytes(1), cf);
         rm.applyUnsafe();
@@ -249,7 +249,7 @@ public class ScrubTest extends SchemaLoader
         {
             String key = String.valueOf(i);
             // create a row and update the birthdate value, test that the index query fetches the new version
-            ColumnFamily cf = TreeMapBackedSortedColumns.factory.create(KEYSPACE, CF);
+            ColumnFamily cf = ArrayBackedSortedColumns.factory.create(KEYSPACE, CF);
             cf.addColumn(column("c1", "1", 1L));
             cf.addColumn(column("c2", "2", 1L));
             Mutation rm = new Mutation(KEYSPACE, ByteBufferUtil.bytes(key), cf);
@@ -264,7 +264,7 @@ public class ScrubTest extends SchemaLoader
         for (int i = 0; i < rowsPerSSTable; i++)
         {
             String key = String.valueOf(i);
-            ColumnFamily cf = TreeMapBackedSortedColumns.factory.create(KEYSPACE, COUNTER_CF);
+            ColumnFamily cf = ArrayBackedSortedColumns.factory.create(KEYSPACE, COUNTER_CF);
             Mutation rm = new Mutation(KEYSPACE, ByteBufferUtil.bytes(key), cf);
             rm.addCounter(COUNTER_CF, cellname("Column1"), 100);
             CounterMutation cm = new CounterMutation(rm, ConsistencyLevel.ONE);

http://git-wip-us.apache.org/repos/asf/cassandra/blob/52045750/test/unit/org/apache/cassandra/db/SerializationsTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/db/SerializationsTest.java b/test/unit/org/apache/cassandra/db/SerializationsTest.java
index 68686cb..f643511 100644
--- a/test/unit/org/apache/cassandra/db/SerializationsTest.java
+++ b/test/unit/org/apache/cassandra/db/SerializationsTest.java
@@ -367,8 +367,8 @@ public class SerializationsTest extends AbstractSerializationsTester
 
         private final long readTs = 1369935512292L;
 
-        private final ColumnFamily StandardCf = TreeMapBackedSortedColumns.factory.create(KS, StandardCF);
-        private final ColumnFamily SuperCf = TreeMapBackedSortedColumns.factory.create(KS, SuperCF);
+        private final ColumnFamily StandardCf = ArrayBackedSortedColumns.factory.create(KS, StandardCF);
+        private final ColumnFamily SuperCf = ArrayBackedSortedColumns.factory.create(KS, SuperCF);
 
         private final Row StandardRow = new Row(Util.dk("key0"), StandardCf);
         private final Row SuperRow = new Row(Util.dk("key1"), SuperCf);

http://git-wip-us.apache.org/repos/asf/cassandra/blob/52045750/test/unit/org/apache/cassandra/io/sstable/SSTableUtils.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/io/sstable/SSTableUtils.java b/test/unit/org/apache/cassandra/io/sstable/SSTableUtils.java
index b25e49c..713a05a 100644
--- a/test/unit/org/apache/cassandra/io/sstable/SSTableUtils.java
+++ b/test/unit/org/apache/cassandra/io/sstable/SSTableUtils.java
@@ -39,7 +39,7 @@ public class SSTableUtils
 
     public static ColumnFamily createCF(long mfda, int ldt, Cell... cols)
     {
-        ColumnFamily cf = TreeMapBackedSortedColumns.factory.create(KEYSPACENAME, CFNAME);
+        ColumnFamily cf = ArrayBackedSortedColumns.factory.create(KEYSPACENAME, CFNAME);
         cf.delete(new DeletionInfo(mfda, ldt));
         for (Cell col : cols)
             cf.addColumn(col);
@@ -163,7 +163,7 @@ public class SSTableUtils
             Map<String, ColumnFamily> map = new HashMap<String, ColumnFamily>();
             for (String key : keys)
             {
-                ColumnFamily cf = TreeMapBackedSortedColumns.factory.create(ksname, cfname);
+                ColumnFamily cf = ArrayBackedSortedColumns.factory.create(ksname, cfname);
                 cf.addColumn(new Cell(Util.cellname(key), ByteBufferUtil.bytes(key), 0));
                 map.put(key, cf);
             }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/52045750/test/unit/org/apache/cassandra/service/RowResolverTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/service/RowResolverTest.java b/test/unit/org/apache/cassandra/service/RowResolverTest.java
index c2d57c6..286d037 100644
--- a/test/unit/org/apache/cassandra/service/RowResolverTest.java
+++ b/test/unit/org/apache/cassandra/service/RowResolverTest.java
@@ -26,9 +26,9 @@ import java.util.Arrays;
 import org.junit.Test;
 
 import org.apache.cassandra.SchemaLoader;
+import org.apache.cassandra.db.ArrayBackedSortedColumns;
 import org.apache.cassandra.db.ColumnFamily;
 import org.apache.cassandra.db.DeletionInfo;
-import org.apache.cassandra.db.TreeMapBackedSortedColumns;
 
 import static org.junit.Assert.*;
 import static org.apache.cassandra.Util.column;
@@ -39,10 +39,10 @@ public class RowResolverTest extends SchemaLoader
     @Test
     public void testResolveSupersetNewer()
     {
-        ColumnFamily cf1 = TreeMapBackedSortedColumns.factory.create("Keyspace1", "Standard1");
+        ColumnFamily cf1 = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1");
         cf1.addColumn(column("c1", "v1", 0));
 
-        ColumnFamily cf2 = TreeMapBackedSortedColumns.factory.create("Keyspace1", "Standard1");
+        ColumnFamily cf2 = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1");
         cf2.addColumn(column("c1", "v2", 1));
 
         ColumnFamily resolved = RowDataResolver.resolveSuperset(Arrays.asList(cf1, cf2), System.currentTimeMillis());
@@ -54,10 +54,10 @@ public class RowResolverTest extends SchemaLoader
     @Test
     public void testResolveSupersetDisjoint()
     {
-        ColumnFamily cf1 = TreeMapBackedSortedColumns.factory.create("Keyspace1", "Standard1");
+        ColumnFamily cf1 = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1");
         cf1.addColumn(column("c1", "v1", 0));
 
-        ColumnFamily cf2 = TreeMapBackedSortedColumns.factory.create("Keyspace1", "Standard1");
+        ColumnFamily cf2 = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1");
         cf2.addColumn(column("c2", "v2", 1));
 
         ColumnFamily resolved = RowDataResolver.resolveSuperset(Arrays.asList(cf1, cf2), System.currentTimeMillis());
@@ -69,7 +69,7 @@ public class RowResolverTest extends SchemaLoader
     @Test
     public void testResolveSupersetNullOne()
     {
-        ColumnFamily cf2 = TreeMapBackedSortedColumns.factory.create("Keyspace1", "Standard1");
+        ColumnFamily cf2 = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1");
         cf2.addColumn(column("c2", "v2", 1));
 
         ColumnFamily resolved = RowDataResolver.resolveSuperset(Arrays.asList(null, cf2), System.currentTimeMillis());
@@ -81,7 +81,7 @@ public class RowResolverTest extends SchemaLoader
     @Test
     public void testResolveSupersetNullTwo()
     {
-        ColumnFamily cf1 = TreeMapBackedSortedColumns.factory.create("Keyspace1", "Standard1");
+        ColumnFamily cf1 = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1");
         cf1.addColumn(column("c1", "v1", 0));
 
         ColumnFamily resolved = RowDataResolver.resolveSuperset(Arrays.asList(cf1, null), System.currentTimeMillis());
@@ -100,10 +100,10 @@ public class RowResolverTest extends SchemaLoader
     public void testResolveDeleted()
     {
         // one CF with columns timestamped before a delete in another cf
-        ColumnFamily cf1 = TreeMapBackedSortedColumns.factory.create("Keyspace1", "Standard1");
+        ColumnFamily cf1 = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1");
         cf1.addColumn(column("one", "A", 0));
 
-        ColumnFamily cf2 = TreeMapBackedSortedColumns.factory.create("Keyspace1", "Standard1");
+        ColumnFamily cf2 = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1");
         cf2.delete(new DeletionInfo(1L, (int) (System.currentTimeMillis() / 1000)));
 
         ColumnFamily resolved = RowDataResolver.resolveSuperset(Arrays.asList(cf1, cf2), System.currentTimeMillis());
@@ -118,19 +118,19 @@ public class RowResolverTest extends SchemaLoader
     {
         // deletes and columns with interleaved timestamp, with out of order return sequence
 
-        ColumnFamily cf1 = TreeMapBackedSortedColumns.factory.create("Keyspace1", "Standard1");
+        ColumnFamily cf1 = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1");
         cf1.delete(new DeletionInfo(0L, (int) (System.currentTimeMillis() / 1000)));
 
         // these columns created after the previous deletion
-        ColumnFamily cf2 = TreeMapBackedSortedColumns.factory.create("Keyspace1", "Standard1");
+        ColumnFamily cf2 = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1");
         cf2.addColumn(column("one", "A", 1));
         cf2.addColumn(column("two", "A", 1));
 
         //this column created after the next delete
-        ColumnFamily cf3 = TreeMapBackedSortedColumns.factory.create("Keyspace1", "Standard1");
+        ColumnFamily cf3 = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1");
         cf3.addColumn(column("two", "B", 3));
 
-        ColumnFamily cf4 = TreeMapBackedSortedColumns.factory.create("Keyspace1", "Standard1");
+        ColumnFamily cf4 = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1");
         cf4.delete(new DeletionInfo(2L, (int) (System.currentTimeMillis() / 1000)));
 
         ColumnFamily resolved = RowDataResolver.resolveSuperset(Arrays.asList(cf1, cf2, cf3, cf4), System.currentTimeMillis());

http://git-wip-us.apache.org/repos/asf/cassandra/blob/52045750/test/unit/org/apache/cassandra/service/pager/AbstractQueryPagerTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/service/pager/AbstractQueryPagerTest.java b/test/unit/org/apache/cassandra/service/pager/AbstractQueryPagerTest.java
index 03a651d..0bb1660 100644
--- a/test/unit/org/apache/cassandra/service/pager/AbstractQueryPagerTest.java
+++ b/test/unit/org/apache/cassandra/service/pager/AbstractQueryPagerTest.java
@@ -120,7 +120,7 @@ public class AbstractQueryPagerTest
 
     private ColumnFamily createCF(int nbCol)
     {
-        ColumnFamily cf = TreeMapBackedSortedColumns.factory.create(createMetadata());
+        ColumnFamily cf = ArrayBackedSortedColumns.factory.create(createMetadata());
         for (int i = 0; i < nbCol; i++)
             cf.addColumn(CellNames.simpleDense(bb(i)), bb(i), 0);
         return cf;

http://git-wip-us.apache.org/repos/asf/cassandra/blob/52045750/test/unit/org/apache/cassandra/streaming/StreamingTransferTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/streaming/StreamingTransferTest.java b/test/unit/org/apache/cassandra/streaming/StreamingTransferTest.java
index e0a89c3..f09b6a4 100644
--- a/test/unit/org/apache/cassandra/streaming/StreamingTransferTest.java
+++ b/test/unit/org/apache/cassandra/streaming/StreamingTransferTest.java
@@ -228,7 +228,7 @@ public class StreamingTransferTest extends SchemaLoader
             public void mutate(String key, String col, long timestamp) throws Exception
             {
                 long val = key.hashCode();
-                ColumnFamily cf = TreeMapBackedSortedColumns.factory.create(keyspace.getName(), cfs.name);
+                ColumnFamily cf = ArrayBackedSortedColumns.factory.create(keyspace.getName(), cfs.name);
                 cf.addColumn(column(col, "v", timestamp));
                 cf.addColumn(new Cell(cellname("birthdate"), ByteBufferUtil.bytes(val), timestamp));
                 Mutation rm = new Mutation("Keyspace1", ByteBufferUtil.bytes(key), cf);
@@ -314,8 +314,8 @@ public class StreamingTransferTest extends SchemaLoader
             public void mutate(String key, String col, long timestamp) throws Exception
             {
                 Map<String, ColumnFamily> entries = new HashMap<>();
-                ColumnFamily cf = TreeMapBackedSortedColumns.factory.create(cfs.metadata);
-                ColumnFamily cfCleaned = TreeMapBackedSortedColumns.factory.create(cfs.metadata);
+                ColumnFamily cf = ArrayBackedSortedColumns.factory.create(cfs.metadata);
+                ColumnFamily cfCleaned = ArrayBackedSortedColumns.factory.create(cfs.metadata);
                 CounterContext.ContextState state = CounterContext.ContextState.allocate(0, 1, 3, HeapAllocator.instance);
                 state.writeLocal(CounterId.fromInt(2), 9L, 3L);
                 state.writeRemote(CounterId.fromInt(4), 4L, 2L);
@@ -452,7 +452,7 @@ public class StreamingTransferTest extends SchemaLoader
         {
             public void mutate(String key, String colName, long timestamp) throws Exception
             {
-                ColumnFamily cf = TreeMapBackedSortedColumns.factory.create(keyspace.getName(), cfs.name);
+                ColumnFamily cf = ArrayBackedSortedColumns.factory.create(keyspace.getName(), cfs.name);
                 cf.addColumn(column(colName, "value", timestamp));
                 cf.addColumn(new Cell(cellname("birthdate"), ByteBufferUtil.bytes(new Date(timestamp).toString()), timestamp));
                 Mutation rm = new Mutation("Keyspace1", ByteBufferUtil.bytes(key), cf);

http://git-wip-us.apache.org/repos/asf/cassandra/blob/52045750/test/unit/org/apache/cassandra/tools/SSTableExportTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/tools/SSTableExportTest.java b/test/unit/org/apache/cassandra/tools/SSTableExportTest.java
index df7a988..b74ba1a 100644
--- a/test/unit/org/apache/cassandra/tools/SSTableExportTest.java
+++ b/test/unit/org/apache/cassandra/tools/SSTableExportTest.java
@@ -56,7 +56,7 @@ public class SSTableExportTest extends SchemaLoader
     public SSTableWriter getDummyWriter() throws IOException
     {
         File tempSS = tempSSTableFile("Keyspace1", "Standard1");
-        ColumnFamily cfamily = TreeMapBackedSortedColumns.factory.create("Keyspace1", "Standard1");
+        ColumnFamily cfamily = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1");
         SSTableWriter writer = new SSTableWriter(tempSS.getPath(), 2, ActiveRepairService.UNREPAIRED_SSTABLE);
 
         // Add rowA
@@ -82,7 +82,7 @@ public class SSTableExportTest extends SchemaLoader
     public void testEnumeratekeys() throws IOException
     {
         File tempSS = tempSSTableFile("Keyspace1", "Standard1");
-        ColumnFamily cfamily = TreeMapBackedSortedColumns.factory.create("Keyspace1", "Standard1");
+        ColumnFamily cfamily = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1");
         SSTableWriter writer = new SSTableWriter(tempSS.getPath(), 2, ActiveRepairService.UNREPAIRED_SSTABLE);
 
         // Add rowA
@@ -117,7 +117,7 @@ public class SSTableExportTest extends SchemaLoader
     public void testExportSimpleCf() throws IOException, ParseException
     {
         File tempSS = tempSSTableFile("Keyspace1", "Standard1");
-        ColumnFamily cfamily = TreeMapBackedSortedColumns.factory.create("Keyspace1", "Standard1");
+        ColumnFamily cfamily = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1");
         SSTableWriter writer = new SSTableWriter(tempSS.getPath(), 2, ActiveRepairService.UNREPAIRED_SSTABLE);
 
         int nowInSec = (int)(System.currentTimeMillis() / 1000) + 42; //live for 42 seconds
@@ -173,7 +173,7 @@ public class SSTableExportTest extends SchemaLoader
     {
         ColumnFamilyStore cfs = Keyspace.open("Keyspace1").getColumnFamilyStore("Standard1");
         File tempSS = tempSSTableFile("Keyspace1", "Standard1");
-        ColumnFamily cfamily = TreeMapBackedSortedColumns.factory.create("Keyspace1", "Standard1");
+        ColumnFamily cfamily = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1");
         SSTableWriter writer = new SSTableWriter(tempSS.getPath(), 2, ActiveRepairService.UNREPAIRED_SSTABLE);
 
         // Add rowA
@@ -212,7 +212,7 @@ public class SSTableExportTest extends SchemaLoader
     public void testExportCounterCf() throws IOException, ParseException
     {
         File tempSS = tempSSTableFile("Keyspace1", "Counter1");
-        ColumnFamily cfamily = TreeMapBackedSortedColumns.factory.create("Keyspace1", "Counter1");
+        ColumnFamily cfamily = ArrayBackedSortedColumns.factory.create("Keyspace1", "Counter1");
         SSTableWriter writer = new SSTableWriter(tempSS.getPath(), 2, ActiveRepairService.UNREPAIRED_SSTABLE);
 
         // Add rowA
@@ -243,7 +243,7 @@ public class SSTableExportTest extends SchemaLoader
     public void testEscapingDoubleQuotes() throws IOException, ParseException
     {
         File tempSS = tempSSTableFile("Keyspace1", "ValuesWithQuotes");
-        ColumnFamily cfamily = TreeMapBackedSortedColumns.factory.create("Keyspace1", "ValuesWithQuotes");
+        ColumnFamily cfamily = ArrayBackedSortedColumns.factory.create("Keyspace1", "ValuesWithQuotes");
         SSTableWriter writer = new SSTableWriter(tempSS.getPath(), 2, ActiveRepairService.UNREPAIRED_SSTABLE);
 
         // Add rowA
@@ -275,7 +275,7 @@ public class SSTableExportTest extends SchemaLoader
     {
 
         File tempSS = tempSSTableFile("Keyspace1", "Standard1");
-        ColumnFamily cfamily = TreeMapBackedSortedColumns.factory.create("Keyspace1", "Standard1");
+        ColumnFamily cfamily = ArrayBackedSortedColumns.factory.create("Keyspace1", "Standard1");
         SSTableWriter writer = new SSTableWriter(tempSS.getPath(), 2, ActiveRepairService.UNREPAIRED_SSTABLE);
 
         // Add rowA

http://git-wip-us.apache.org/repos/asf/cassandra/blob/52045750/test/unit/org/apache/cassandra/utils/EncodedStreamsTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/utils/EncodedStreamsTest.java b/test/unit/org/apache/cassandra/utils/EncodedStreamsTest.java
index 7032d73..0c5d49c 100644
--- a/test/unit/org/apache/cassandra/utils/EncodedStreamsTest.java
+++ b/test/unit/org/apache/cassandra/utils/EncodedStreamsTest.java
@@ -26,8 +26,8 @@ import java.io.DataOutputStream;
 import java.io.IOException;
 
 import org.apache.cassandra.SchemaLoader;
+import org.apache.cassandra.db.ArrayBackedSortedColumns;
 import org.apache.cassandra.db.ColumnFamily;
-import org.apache.cassandra.db.TreeMapBackedSortedColumns;
 import org.apache.cassandra.db.TypeSizes;
 import org.apache.cassandra.net.MessagingService;
 import org.apache.cassandra.utils.vint.EncodedDataInputStream;
@@ -97,7 +97,7 @@ public class EncodedStreamsTest extends SchemaLoader
 
     private ColumnFamily createCF()
     {
-        ColumnFamily cf = TreeMapBackedSortedColumns.factory.create(keyspaceName, standardCFName);
+        ColumnFamily cf = ArrayBackedSortedColumns.factory.create(keyspaceName, standardCFName);
         cf.addColumn(column("vijay", "try", 1));
         cf.addColumn(column("to", "be_nice", 1));
         return cf;
@@ -105,7 +105,7 @@ public class EncodedStreamsTest extends SchemaLoader
 
     private ColumnFamily createCounterCF()
     {
-        ColumnFamily cf = TreeMapBackedSortedColumns.factory.create(keyspaceName, counterCFName);
+        ColumnFamily cf = ArrayBackedSortedColumns.factory.create(keyspaceName, counterCFName);
         cf.addColumn(counterColumn("vijay", 1L, 1));
         cf.addColumn(counterColumn("wants", 1000000, 1));
         return cf;


[2/3] git commit: Optimize (rewrite) ArrayBackedSortedColumns

Posted by al...@apache.org.
Optimize (rewrite) ArrayBackedSortedColumns

patch by Aleksey Yeschenko; reviewed by Benedict Elliott Smith for
CASSANDRA-6662


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/fb1c6b9c
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/fb1c6b9c
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/fb1c6b9c

Branch: refs/heads/trunk
Commit: fb1c6b9cded56e63dfcc765515edbc94ee9f67a0
Parents: 0e43885
Author: Aleksey Yeschenko <al...@apache.org>
Authored: Tue Feb 11 20:30:57 2014 +0300
Committer: Aleksey Yeschenko <al...@apache.org>
Committed: Tue Feb 11 20:35:31 2014 +0300

----------------------------------------------------------------------
 CHANGES.txt                                     |   3 +-
 .../cassandra/db/ArrayBackedSortedColumns.java  | 333 +++++++++++++------
 .../db/ArrayBackedSortedColumnsTest.java        |  69 ++++
 3 files changed, 305 insertions(+), 100 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/fb1c6b9c/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 7f9f9d2..d8478e9 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -25,7 +25,8 @@
  * CF id is changed to be non-deterministic. Data dir/key cache are created
    uniquely for CF id (CASSANDRA-5202)
  * New counters implementation (CASSANDRA-6504)
- * Replace UnsortedColumns usage with ArrayBackedSortedColumns (CASSANDRA-6630)
+ * Replace UnsortedColumns and TreeMapBackedSortedColumns with rewritten
+   ArrayBackedSortedColumns (CASSANDRA-6630, CASSANDRA-6662)
  * Add option to use row cache with a given amount of rows (CASSANDRA-5357)
  * Avoid repairing already repaired data (CASSANDRA-5351)
 

http://git-wip-us.apache.org/repos/asf/cassandra/blob/fb1c6b9c/src/java/org/apache/cassandra/db/ArrayBackedSortedColumns.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/ArrayBackedSortedColumns.java b/src/java/org/apache/cassandra/db/ArrayBackedSortedColumns.java
index ba082e9..a6153e4 100644
--- a/src/java/org/apache/cassandra/db/ArrayBackedSortedColumns.java
+++ b/src/java/org/apache/cassandra/db/ArrayBackedSortedColumns.java
@@ -31,16 +31,23 @@ import org.apache.cassandra.db.composites.Composite;
 import org.apache.cassandra.db.filter.ColumnSlice;
 
 /**
- * A ColumnFamily backed by an ArrayList.
+ * A ColumnFamily backed by an array.
  * This implementation is not synchronized and should only be used when
  * thread-safety is not required. This implementation makes sense when the
- * main operations performed are iterating over the map and adding cells
+ * main operations performed are iterating over the cells and adding cells
  * (especially if insertion is in sorted order).
  */
 public class ArrayBackedSortedColumns extends AbstractThreadUnsafeSortedColumns
 {
+    private static final int INITIAL_CAPACITY = 10;
+
+    private static final Cell[] EMPTY_ARRAY = new Cell[0];
+
     private final boolean reversed;
-    private final ArrayList<Cell> cells;
+
+    private Cell[] cells;
+    private int size;
+    private int sortedSize;
 
     public static final ColumnFamily.Factory<ArrayBackedSortedColumns> factory = new Factory<ArrayBackedSortedColumns>()
     {
@@ -54,14 +61,18 @@ public class ArrayBackedSortedColumns extends AbstractThreadUnsafeSortedColumns
     {
         super(metadata);
         this.reversed = reversed;
-        this.cells = new ArrayList<>();
+        this.cells = new Cell[INITIAL_CAPACITY];
+        this.size = 0;
+        this.sortedSize = 0;
     }
 
-    private ArrayBackedSortedColumns(Collection<Cell> cells, CFMetaData metadata, boolean reversed)
+    private ArrayBackedSortedColumns(ArrayBackedSortedColumns original)
     {
-        super(metadata);
-        this.reversed = reversed;
-        this.cells = new ArrayList<>(cells);
+        super(original.metadata);
+        this.reversed = original.reversed;
+        this.cells = Arrays.copyOf(original.cells, original.size);
+        this.size = original.size;
+        this.sortedSize = original.sortedSize;
     }
 
     public ColumnFamily.Factory getFactory()
@@ -71,7 +82,7 @@ public class ArrayBackedSortedColumns extends AbstractThreadUnsafeSortedColumns
 
     public ColumnFamily cloneMe()
     {
-        return new ArrayBackedSortedColumns(cells, metadata, reversed);
+        return new ArrayBackedSortedColumns(this);
     }
 
     public boolean isInsertReversed()
@@ -84,72 +95,191 @@ public class ArrayBackedSortedColumns extends AbstractThreadUnsafeSortedColumns
         return reversed ? getComparator().reverseComparator() : getComparator();
     }
 
+    private void maybeSortCells()
+    {
+        if (size != sortedSize)
+            sortCells();
+    }
+
+    private void sortCells()
+    {
+        Comparator<Cell> comparator = reversed
+                                    ? getComparator().columnReverseComparator()
+                                    : getComparator().columnComparator();
+
+        // Sort the unsorted segment - will still potentially contain duplicate (non-reconciled) cells
+        Arrays.sort(cells, sortedSize, size, comparator);
+
+        // Determine the merge start position for that segment
+        int pos = binarySearch(0, sortedSize, cells[sortedSize].name, internalComparator());
+        if (pos < 0)
+            pos = -pos - 1;
+
+        // Copy [pos, lastSortedCellIndex] cells into a separate array
+        Cell[] leftCopy = pos == sortedSize
+                        ? EMPTY_ARRAY
+                        : Arrays.copyOfRange(cells, pos, sortedSize);
+
+        // Store the beginning (inclusive) and the end (exclusive) indexes of the right segment
+        int rightStart = sortedSize;
+        int rightEnd = size;
+
+        // 'Trim' the size to what's left without the leftCopy
+        size = sortedSize = pos;
+
+        // Merge the cells from both segments. When adding from the left segment we can rely on it not having any
+        // duplicate cells, and thus omit the comparison with the previously entered cell - we'll never need to reconcile.
+        int l = 0, r = rightStart;
+        while (l < leftCopy.length && r < rightEnd)
+        {
+            int cmp = comparator.compare(leftCopy[l], cells[r]);
+            if (cmp < 0)
+                internalAppend(leftCopy[l++]);
+            else if (cmp == 0)
+                internalAppend(leftCopy[l++].reconcile(cells[r++]));
+            else
+                internalAppendOrReconcile(cells[r++]);
+        }
+        while (l < leftCopy.length)
+            internalAppend(leftCopy[l++]);
+        while (r < rightEnd)
+            internalAppendOrReconcile(cells[r++]);
+
+        // Nullify the remainder of the array (in case we had duplicate cells that got reconciled)
+        for (int i = size; i < rightEnd; i++)
+            cells[i] = null;
+    }
+
     public Cell getColumn(CellName name)
     {
+        maybeSortCells();
         int pos = binarySearch(name);
-        return pos >= 0 ? cells.get(pos) : null;
+        return pos >= 0 ? cells[pos] : null;
     }
 
     public void addColumn(Cell cell)
     {
-        if (cells.isEmpty())
+        if (size == 0)
         {
-            cells.add(cell);
+            internalAdd(cell);
+            sortedSize++;
             return;
         }
 
-        int c = internalComparator().compare(cells.get(getColumnCount() - 1).name(), cell.name());
+        if (size != sortedSize)
+        {
+            internalAdd(cell);
+            return;
+        }
 
+        int c = internalComparator().compare(cells[size - 1].name(), cell.name());
         if (c < 0)
         {
-            // Insert as last
-            cells.add(cell);
+            // Append to the end
+            internalAdd(cell);
+            sortedSize++;
         }
         else if (c == 0)
         {
-            // Resolve against last
-            resolveAgainst(getColumnCount() - 1, cell);
+            // Resolve against the last cell
+            reconcileWith(size - 1, cell);
         }
         else
         {
-            int pos = binarySearch(cell.name());
-            if (pos >= 0)
-                resolveAgainst(pos, cell);
-            else
-                cells.add(-pos - 1, cell);
+            // Append to the end, making cells unsorted from now on
+            internalAdd(cell);
         }
     }
 
+    public void addAll(ColumnFamily other)
+    {
+        delete(other.deletionInfo());
+
+        if (other.getColumnCount() == 0)
+            return;
+
+        Iterator<Cell> iterator = reversed ? other.reverseIterator() : other.iterator();
+        while (iterator.hasNext())
+            addColumn(iterator.next());
+    }
+
+    /**
+     * Add a cell to the array, 'resizing' it first if necessary (if it doesn't fit).
+     */
+    private void internalAdd(Cell cell)
+    {
+        // Resize the backing array if we hit the capacity
+        if (cells.length == size)
+            cells = Arrays.copyOf(cells, size * 3 / 2 + 1);
+        cells[size++] = cell;
+    }
+
+    /**
+     * Appends a cell to the array, with the knowledge that array has enough capacity for the new cell, and that
+     * the cell is being added in the sorted order, but may or may not need to be reconciled with the previously
+     * appended one.
+     */
+    private void internalAppendOrReconcile(Cell cell)
+    {
+        if (size > 0 && cells[size - 1].name().equals(cell.name()))
+            reconcileWith(size - 1, cell);
+        else
+            internalAppend(cell);
+    }
+
+    /**
+     * Appends a cell to the array, with the knowledge that array has enough capacity for the new cell, and that
+     * the cell is being added in the sorted order, and the added cell is not a duplicate of a previously inserted one.
+     */
+    private void internalAppend(Cell cell)
+    {
+        cells[size] = cell;
+        size++;
+        sortedSize++;
+    }
+
+    /**
+     * Remove the cell at a given index, shifting the rest of the array to the left if needed.
+     * Please note that we mostly remove from the end, so the shifting should be rare.
+     */
+    private void internalRemove(int index)
+    {
+        int moving = size - index - 1;
+        if (moving > 0)
+            System.arraycopy(cells, index + 1, cells, index, moving);
+        cells[--size] = null;
+    }
+
     /**
-     * Resolve against element at position i.
+     * Reconcile with a cell at position i.
      * Assume that i is a valid position.
      */
-    private void resolveAgainst(int i, Cell cell)
+    private void reconcileWith(int i, Cell cell)
     {
-        cells.set(i, cell.reconcile(cells.get(i)));
+        cells[i] = cell.reconcile(cells[i]);
     }
 
     private int binarySearch(CellName name)
     {
-        return binarySearch(cells, internalComparator(), name, 0);
+        return binarySearch(0, size, name, internalComparator());
     }
 
     /**
-     * Simple binary search for a given column name.
+     * Simple binary search for a given cell name.
      * The return value has the exact same meaning that the one of Collections.binarySearch().
      * (We don't use Collections.binarySearch() directly because it would require us to create
      * a fake Cell (as well as an Cell comparator) to do the search, which is ugly.
      */
-    private static int binarySearch(List<Cell> cells, Comparator<Composite> comparator, Composite name, int start)
+    private int binarySearch(int fromIndex, int toIndex, Composite name, Comparator<Composite> comparator)
     {
-        int low = start;
-        int mid = cells.size();
+        int low = fromIndex;
+        int mid = toIndex;
         int high = mid - 1;
         int result = -1;
         while (low <= high)
         {
             mid = (low + high) >> 1;
-            if ((result = comparator.compare(name, cells.get(mid).name())) > 0)
+            if ((result = comparator.compare(name, cells[mid].name())) > 0)
                 low = mid + 1;
             else if (result == 0)
                 return mid;
@@ -159,78 +289,36 @@ public class ArrayBackedSortedColumns extends AbstractThreadUnsafeSortedColumns
         return -mid - (result < 0 ? 1 : 2);
     }
 
-    public void addAll(ColumnFamily cm)
-    {
-        delete(cm.deletionInfo());
-        if (cm.getColumnCount() == 0)
-            return;
-
-        Cell[] copy = cells.toArray(new Cell[getColumnCount()]);
-        int idx = 0;
-        Iterator<Cell> other = reversed ? cm.reverseIterator(ColumnSlice.ALL_COLUMNS_ARRAY) : cm.iterator();
-        Cell otherCell = other.next();
-
-        cells.clear();
-
-        while (idx < copy.length && otherCell != null)
-        {
-            int c = internalComparator().compare(copy[idx].name(), otherCell.name());
-            if (c < 0)
-            {
-                cells.add(copy[idx]);
-                idx++;
-            }
-            else if (c > 0)
-            {
-                cells.add(otherCell);
-                otherCell = other.hasNext() ? other.next() : null;
-            }
-            else // c == 0
-            {
-                cells.add(copy[idx]);
-                resolveAgainst(getColumnCount() - 1, otherCell);
-                idx++;
-                otherCell = other.hasNext() ? other.next() : null;
-            }
-        }
-
-        while (idx < copy.length)
-            cells.add(copy[idx++]);
-
-        while (otherCell != null)
-        {
-            cells.add(otherCell);
-            otherCell = other.hasNext() ? other.next() : null;
-        }
-    }
-
     public Collection<Cell> getSortedColumns()
     {
-        return reversed ? new ReverseSortedCollection() : cells;
+        maybeSortCells();
+        return reversed ? new ReverseSortedCollection() : new ForwardSortedCollection();
     }
 
     public Collection<Cell> getReverseSortedColumns()
     {
-        // If reversed, the element are sorted reversely, so we could expect
-        // to return *this*, but *this* redefine the iterator to be in sorted
-        // order, so we need a collection that uses the super constructor
+        maybeSortCells();
         return reversed ? new ForwardSortedCollection() : new ReverseSortedCollection();
     }
 
     public int getColumnCount()
     {
-        return cells.size();
+        maybeSortCells();
+        return size;
     }
 
     public void clear()
     {
         setDeletionInfo(DeletionInfo.live());
-        cells.clear();
+        for (int i = 0; i < size; i++)
+            cells[i] = null;
+        size = sortedSize = 0;
     }
 
     public Iterable<CellName> getColumnNames()
     {
-        return Iterables.transform(cells, new Function<Cell, CellName>()
+        maybeSortCells();
+        return Iterables.transform(new ForwardSortedCollection(), new Function<Cell, CellName>()
         {
             public CellName apply(Cell cell)
             {
@@ -241,17 +329,19 @@ public class ArrayBackedSortedColumns extends AbstractThreadUnsafeSortedColumns
 
     public Iterator<Cell> iterator(ColumnSlice[] slices)
     {
-        return new SlicesIterator(cells, getComparator(), slices, reversed);
+        maybeSortCells();
+        return new SlicesIterator(Arrays.asList(cells).subList(0, size), getComparator(), slices, reversed);
     }
 
     public Iterator<Cell> reverseIterator(ColumnSlice[] slices)
     {
-        return new SlicesIterator(cells, getComparator(), slices, !reversed);
+        maybeSortCells();
+        return new SlicesIterator(Arrays.asList(cells).subList(0, size), getComparator(), slices, !reversed);
     }
 
     private static class SlicesIterator extends AbstractIterator<Cell>
     {
-        private final List<Cell> list;
+        private final List<Cell> cells;
         private final ColumnSlice[] slices;
         private final Comparator<Composite> comparator;
 
@@ -259,9 +349,9 @@ public class ArrayBackedSortedColumns extends AbstractThreadUnsafeSortedColumns
         private int previousSliceEnd = 0;
         private Iterator<Cell> currentSlice;
 
-        public SlicesIterator(List<Cell> list, CellNameType comparator, ColumnSlice[] slices, boolean reversed)
+        public SlicesIterator(List<Cell> cells, CellNameType comparator, ColumnSlice[] slices, boolean reversed)
         {
-            this.list = reversed ? Lists.reverse(list) : list;
+            this.cells = reversed ? Lists.reverse(cells) : cells;
             this.slices = slices;
             this.comparator = reversed ? comparator.reverseComparator() : comparator;
         }
@@ -275,21 +365,21 @@ public class ArrayBackedSortedColumns extends AbstractThreadUnsafeSortedColumns
 
                 ColumnSlice slice = slices[idx++];
                 // The first idx to include
-                int startIdx = slice.start.isEmpty() ? 0 : binarySearch(list, comparator, slice.start, previousSliceEnd);
+                int startIdx = slice.start.isEmpty() ? 0 : binarySearch(previousSliceEnd, slice.start);
                 if (startIdx < 0)
                     startIdx = -startIdx - 1;
 
                 // The first idx to exclude
-                int finishIdx = slice.finish.isEmpty() ? list.size() - 1 : binarySearch(list, comparator, slice.finish, previousSliceEnd);
+                int finishIdx = slice.finish.isEmpty() ? cells.size() - 1 : binarySearch(previousSliceEnd, slice.finish);
                 if (finishIdx >= 0)
                     finishIdx++;
                 else
                     finishIdx = -finishIdx - 1;
 
-                if (startIdx == 0 && finishIdx == list.size())
-                    currentSlice = list.iterator();
+                if (startIdx == 0 && finishIdx == cells.size())
+                    currentSlice = cells.iterator();
                 else
-                    currentSlice = list.subList(startIdx, finishIdx).iterator();
+                    currentSlice = cells.subList(startIdx, finishIdx).iterator();
 
                 previousSliceEnd = finishIdx > 0 ? finishIdx - 1 : 0;
             }
@@ -300,20 +390,40 @@ public class ArrayBackedSortedColumns extends AbstractThreadUnsafeSortedColumns
             currentSlice = null;
             return computeNext();
         }
+
+        // Copy of ABSC.binarySearch() that takes lists
+        private int binarySearch(int fromIndex, Composite name)
+        {
+            int low = fromIndex;
+            int mid = cells.size();
+            int high = mid - 1;
+            int result = -1;
+            while (low <= high)
+            {
+                mid = (low + high) >> 1;
+                if ((result = comparator.compare(name, cells.get(mid).name())) > 0)
+                    low = mid + 1;
+                else if (result == 0)
+                    return mid;
+                else
+                    high = mid - 1;
+            }
+            return -mid - (result < 0 ? 1 : 2);
+        }
     }
 
     private class ReverseSortedCollection extends AbstractCollection<Cell>
     {
         public int size()
         {
-            return cells.size();
+            return size;
         }
 
         public Iterator<Cell> iterator()
         {
             return new Iterator<Cell>()
             {
-                int idx = size() - 1;
+                int idx = size - 1;
                 boolean shouldCallNext = true;
 
                 public boolean hasNext()
@@ -324,15 +434,16 @@ public class ArrayBackedSortedColumns extends AbstractThreadUnsafeSortedColumns
                 public Cell next()
                 {
                     shouldCallNext = false;
-                    return cells.get(idx--);
+                    return cells[idx--];
                 }
 
                 public void remove()
                 {
                     if (shouldCallNext)
                         throw new IllegalStateException();
-                    cells.remove(idx + 1);
+                    internalRemove(idx + 1);
                     shouldCallNext = true;
+                    sortedSize--;
                 }
             };
         }
@@ -342,12 +453,36 @@ public class ArrayBackedSortedColumns extends AbstractThreadUnsafeSortedColumns
     {
         public int size()
         {
-            return cells.size();
+            return size;
         }
 
         public Iterator<Cell> iterator()
         {
-            return cells.iterator();
+            return new Iterator<Cell>()
+            {
+                int idx = 0;
+                boolean shouldCallNext = true;
+
+                public boolean hasNext()
+                {
+                    return idx < size;
+                }
+
+                public Cell next()
+                {
+                    shouldCallNext = false;
+                    return cells[idx++];
+                }
+
+                public void remove()
+                {
+                    if (shouldCallNext)
+                        throw new IllegalStateException();
+                    internalRemove(--idx);
+                    shouldCallNext = true;
+                    sortedSize--;
+                }
+            };
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/fb1c6b9c/test/unit/org/apache/cassandra/db/ArrayBackedSortedColumnsTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/db/ArrayBackedSortedColumnsTest.java b/test/unit/org/apache/cassandra/db/ArrayBackedSortedColumnsTest.java
index d98dab6..a1c98f3 100644
--- a/test/unit/org/apache/cassandra/db/ArrayBackedSortedColumnsTest.java
+++ b/test/unit/org/apache/cassandra/db/ArrayBackedSortedColumnsTest.java
@@ -63,6 +63,75 @@ public class ArrayBackedSortedColumnsTest extends SchemaLoader
     }
 
     @Test
+    public void testOutOfOrder()
+    {
+        testAddOutOfOrder(false);
+        testAddOutOfOrder(false);
+    }
+
+    private void testAddOutOfOrder(boolean reversed)
+    {
+        CellNameType type = new SimpleDenseCellNameType(Int32Type.instance);
+        ColumnFamily cells = ArrayBackedSortedColumns.factory.create(metadata(), reversed);
+
+        int[] values = new int[]{ 1, 2, 1, 3, 4, 4, 5, 5, 1, 2, 6, 6, 6, 1, 2, 3 };
+        for (int i = 0; i < values.length; ++i)
+            cells.addColumn(new Cell(type.makeCellName(values[reversed ? values.length - 1 - i : i])));
+
+        assertEquals(6, cells.getColumnCount());
+
+        Iterator<Cell> iter = cells.iterator();
+        assertEquals(1, iter.next().name().toByteBuffer().getInt(0));
+        assertEquals(2, iter.next().name().toByteBuffer().getInt(0));
+        assertEquals(3, iter.next().name().toByteBuffer().getInt(0));
+        assertEquals(4, iter.next().name().toByteBuffer().getInt(0));
+        assertEquals(5, iter.next().name().toByteBuffer().getInt(0));
+        assertEquals(6, iter.next().name().toByteBuffer().getInt(0));
+
+        // Add more values
+        values = new int[]{ 11, 15, 12, 12, 12, 16, 10, 8, 8, 7, 4, 4, 5 };
+        for (int i = 0; i < values.length; ++i)
+            cells.addColumn(new Cell(type.makeCellName(values[reversed ? values.length - 1 - i : i])));
+
+        assertEquals(13, cells.getColumnCount());
+
+        iter = cells.reverseIterator();
+        assertEquals(16, iter.next().name().toByteBuffer().getInt(0));
+        assertEquals(15, iter.next().name().toByteBuffer().getInt(0));
+        assertEquals(12, iter.next().name().toByteBuffer().getInt(0));
+        assertEquals(11, iter.next().name().toByteBuffer().getInt(0));
+        assertEquals(10, iter.next().name().toByteBuffer().getInt(0));
+        assertEquals(8,  iter.next().name().toByteBuffer().getInt(0));
+        assertEquals(7, iter.next().name().toByteBuffer().getInt(0));
+        assertEquals(6, iter.next().name().toByteBuffer().getInt(0));
+        assertEquals(5, iter.next().name().toByteBuffer().getInt(0));
+        assertEquals(4, iter.next().name().toByteBuffer().getInt(0));
+        assertEquals(3, iter.next().name().toByteBuffer().getInt(0));
+        assertEquals(2, iter.next().name().toByteBuffer().getInt(0));
+        assertEquals(1, iter.next().name().toByteBuffer().getInt(0));
+    }
+
+    @Test
+    public void testGetColumn()
+    {
+        testGetColumnInternal(true);
+        testGetColumnInternal(false);
+    }
+
+    private void testGetColumnInternal(boolean reversed)
+    {
+        CellNameType type = new SimpleDenseCellNameType(Int32Type.instance);
+        ColumnFamily cells = ArrayBackedSortedColumns.factory.create(metadata(), reversed);
+
+        int[] values = new int[]{ -1, 20, 44, 55, 27, 27, 17, 1, 9, 89, 33, 44, 0, 9 };
+        for (int i = 0; i < values.length; ++i)
+            cells.addColumn(new Cell(type.makeCellName(values[reversed ? values.length - 1 - i : i])));
+
+        for (int i : values)
+            assertEquals(i, cells.getColumn(type.makeCellName(i)).name().toByteBuffer().getInt(0));
+    }
+
+    @Test
     public void testAddAll()
     {
         testAddAllInternal(false);


[3/3] git commit: ColumnFamily-related cleanups

Posted by al...@apache.org.
ColumnFamily-related cleanups

patch by Aleksey Yeschenko; reviewed by Benedict Elliott Smith for
CASSANDRA-6662


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/0e43885a
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/0e43885a
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/0e43885a

Branch: refs/heads/trunk
Commit: 0e43885ab24768177cc1e758e1ab69b6dc1b23db
Parents: 5a3ffc0
Author: Aleksey Yeschenko <al...@yeschenko.com>
Authored: Sun Feb 9 06:22:47 2014 +0300
Committer: Aleksey Yeschenko <al...@apache.org>
Committed: Tue Feb 11 20:35:31 2014 +0300

----------------------------------------------------------------------
 .../cassandra/db/ArrayBackedSortedColumns.java  | 56 +++++---------------
 .../apache/cassandra/db/AtomicBTreeColumns.java | 15 +-----
 .../cassandra/db/CollationController.java       |  5 +-
 .../org/apache/cassandra/db/ColumnFamily.java   | 50 ++---------------
 .../apache/cassandra/db/ColumnFamilyStore.java  | 23 ++++----
 .../org/apache/cassandra/db/EmptyColumns.java   | 18 ++-----
 .../db/TreeMapBackedSortedColumns.java          | 47 ++--------------
 .../cassandra/db/index/keys/KeysSearcher.java   |  6 +--
 .../db/ArrayBackedSortedColumnsTest.java        | 25 ++++-----
 .../apache/cassandra/db/ColumnFamilyTest.java   | 15 +++---
 10 files changed, 58 insertions(+), 202 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/0e43885a/src/java/org/apache/cassandra/db/ArrayBackedSortedColumns.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/ArrayBackedSortedColumns.java b/src/java/org/apache/cassandra/db/ArrayBackedSortedColumns.java
index b81e403..ba082e9 100644
--- a/src/java/org/apache/cassandra/db/ArrayBackedSortedColumns.java
+++ b/src/java/org/apache/cassandra/db/ArrayBackedSortedColumns.java
@@ -29,7 +29,6 @@ import org.apache.cassandra.db.composites.CellName;
 import org.apache.cassandra.db.composites.CellNameType;
 import org.apache.cassandra.db.composites.Composite;
 import org.apache.cassandra.db.filter.ColumnSlice;
-import org.apache.cassandra.utils.memory.AbstractAllocator;
 
 /**
  * A ColumnFamily backed by an ArrayList.
@@ -55,14 +54,14 @@ public class ArrayBackedSortedColumns extends AbstractThreadUnsafeSortedColumns
     {
         super(metadata);
         this.reversed = reversed;
-        this.cells = new ArrayList<Cell>();
+        this.cells = new ArrayList<>();
     }
 
     private ArrayBackedSortedColumns(Collection<Cell> cells, CFMetaData metadata, boolean reversed)
     {
         super(metadata);
         this.reversed = reversed;
-        this.cells = new ArrayList<Cell>(cells);
+        this.cells = new ArrayList<>(cells);
     }
 
     public ColumnFamily.Factory getFactory()
@@ -91,7 +90,7 @@ public class ArrayBackedSortedColumns extends AbstractThreadUnsafeSortedColumns
         return pos >= 0 ? cells.get(pos) : null;
     }
 
-    public void addColumn(Cell cell, AbstractAllocator allocator)
+    public void addColumn(Cell cell)
     {
         if (cells.isEmpty())
         {
@@ -109,13 +108,13 @@ public class ArrayBackedSortedColumns extends AbstractThreadUnsafeSortedColumns
         else if (c == 0)
         {
             // Resolve against last
-            resolveAgainst(getColumnCount() - 1, cell, allocator);
+            resolveAgainst(getColumnCount() - 1, cell);
         }
         else
         {
             int pos = binarySearch(cell.name());
             if (pos >= 0)
-                resolveAgainst(pos, cell, allocator);
+                resolveAgainst(pos, cell);
             else
                 cells.add(-pos - 1, cell);
         }
@@ -125,13 +124,9 @@ public class ArrayBackedSortedColumns extends AbstractThreadUnsafeSortedColumns
      * Resolve against element at position i.
      * Assume that i is a valid position.
      */
-    private void resolveAgainst(int i, Cell cell, AbstractAllocator allocator)
+    private void resolveAgainst(int i, Cell cell)
     {
-        Cell oldCell = cells.get(i);
-
-        // calculate reconciled col from old (existing) col and new col
-        Cell reconciledCell = cell.reconcile(oldCell, allocator);
-        cells.set(i, reconciledCell);
+        cells.set(i, cell.reconcile(cells.get(i)));
     }
 
     private int binarySearch(CellName name)
@@ -155,22 +150,16 @@ public class ArrayBackedSortedColumns extends AbstractThreadUnsafeSortedColumns
         {
             mid = (low + high) >> 1;
             if ((result = comparator.compare(name, cells.get(mid).name())) > 0)
-            {
                 low = mid + 1;
-            }
             else if (result == 0)
-            {
                 return mid;
-            }
             else
-            {
                 high = mid - 1;
-            }
         }
         return -mid - (result < 0 ? 1 : 2);
     }
 
-    public void addAll(ColumnFamily cm, AbstractAllocator allocator, Function<Cell, Cell> transformation)
+    public void addAll(ColumnFamily cm)
     {
         delete(cm.deletionInfo());
         if (cm.getColumnCount() == 0)
@@ -193,42 +182,28 @@ public class ArrayBackedSortedColumns extends AbstractThreadUnsafeSortedColumns
             }
             else if (c > 0)
             {
-                cells.add(transformation.apply(otherCell));
+                cells.add(otherCell);
                 otherCell = other.hasNext() ? other.next() : null;
             }
             else // c == 0
             {
                 cells.add(copy[idx]);
-                resolveAgainst(getColumnCount() - 1, transformation.apply(otherCell), allocator);
+                resolveAgainst(getColumnCount() - 1, otherCell);
                 idx++;
                 otherCell = other.hasNext() ? other.next() : null;
             }
         }
+
         while (idx < copy.length)
-        {
             cells.add(copy[idx++]);
-        }
+
         while (otherCell != null)
         {
-            cells.add(transformation.apply(otherCell));
+            cells.add(otherCell);
             otherCell = other.hasNext() ? other.next() : null;
         }
     }
 
-    public boolean replace(Cell oldCell, Cell newCell)
-    {
-        if (!oldCell.name().equals(newCell.name()))
-            throw new IllegalArgumentException();
-
-        int pos = binarySearch(oldCell.name());
-        if (pos >= 0)
-        {
-            cells.set(pos, newCell);
-        }
-
-        return pos >= 0;
-    }
-
     public Collection<Cell> getSortedColumns()
     {
         return reversed ? new ReverseSortedCollection() : cells;
@@ -264,11 +239,6 @@ public class ArrayBackedSortedColumns extends AbstractThreadUnsafeSortedColumns
         });
     }
 
-    public Iterator<Cell> iterator()
-    {
-        return reversed ? Lists.reverse(cells).iterator() : cells.iterator();
-    }
-
     public Iterator<Cell> iterator(ColumnSlice[] slices)
     {
         return new SlicesIterator(cells, getComparator(), slices, reversed);

http://git-wip-us.apache.org/repos/asf/cassandra/blob/0e43885a/src/java/org/apache/cassandra/db/AtomicBTreeColumns.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/AtomicBTreeColumns.java b/src/java/org/apache/cassandra/db/AtomicBTreeColumns.java
index c1c7b66..5f56326 100644
--- a/src/java/org/apache/cassandra/db/AtomicBTreeColumns.java
+++ b/src/java/org/apache/cassandra/db/AtomicBTreeColumns.java
@@ -34,7 +34,6 @@ import org.apache.cassandra.config.CFMetaData;
 import org.apache.cassandra.db.composites.CellName;
 import org.apache.cassandra.db.composites.CellNameType;
 import org.apache.cassandra.db.filter.ColumnSlice;
-import org.apache.cassandra.db.index.SecondaryIndexManager;
 import org.apache.cassandra.utils.ObjectSizes;
 import org.apache.cassandra.utils.btree.BTree;
 import org.apache.cassandra.utils.btree.BTreeSet;
@@ -93,11 +92,6 @@ public class AtomicBTreeColumns extends ColumnFamily
         this.ref = holder;
     }
 
-    public CellNameType getComparator()
-    {
-        return metadata.comparator;
-    }
-
     public Factory getFactory()
     {
         return factory;
@@ -158,11 +152,6 @@ public class AtomicBTreeColumns extends ColumnFamily
         }
     }
 
-    public void addAll(ColumnFamily cm, AbstractAllocator allocator, Function<Cell, Cell> transformation)
-    {
-        addAllWithSizeDelta(cm, allocator, transformation, SecondaryIndexManager.nullUpdater, new Delta());
-    }
-
     // the function we provide to the btree utilities to perform any column replacements
     private static final class ColumnUpdater implements UpdateFunction<Cell>
     {
@@ -282,12 +271,12 @@ public class AtomicBTreeColumns extends ColumnFamily
 
     // no particular reason not to implement these next methods, we just haven't needed them yet
 
-    public void addColumn(Cell column, AbstractAllocator allocator)
+    public void addColumn(Cell column)
     {
         throw new UnsupportedOperationException();
     }
 
-    public boolean replace(Cell oldColumn, Cell newColumn)
+    public void addAll(ColumnFamily cf)
     {
         throw new UnsupportedOperationException();
     }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/0e43885a/src/java/org/apache/cassandra/db/CollationController.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/CollationController.java b/src/java/org/apache/cassandra/db/CollationController.java
index 0ce2654..3fd3e8b 100644
--- a/src/java/org/apache/cassandra/db/CollationController.java
+++ b/src/java/org/apache/cassandra/db/CollationController.java
@@ -30,7 +30,6 @@ import org.apache.cassandra.db.marshal.CounterColumnType;
 import org.apache.cassandra.io.sstable.SSTableReader;
 import org.apache.cassandra.io.util.FileUtils;
 import org.apache.cassandra.tracing.Tracing;
-import org.apache.cassandra.utils.memory.HeapAllocator;
 
 public class CollationController
 {
@@ -87,7 +86,7 @@ public class CollationController
                         temp.addAtom(iter.next());
                 }
 
-                container.addAll(temp, HeapAllocator.instance);
+                container.addAll(temp);
                 temp.clear();
             }
 
@@ -129,7 +128,7 @@ public class CollationController
                         temp.addAtom(iter.next());
                 }
 
-                container.addAll(temp, HeapAllocator.instance);
+                container.addAll(temp);
                 temp.clear();
             }
 

http://git-wip-us.apache.org/repos/asf/cassandra/blob/0e43885a/src/java/org/apache/cassandra/db/ColumnFamily.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/ColumnFamily.java b/src/java/org/apache/cassandra/db/ColumnFamily.java
index 610e869..2bf91bf 100644
--- a/src/java/org/apache/cassandra/db/ColumnFamily.java
+++ b/src/java/org/apache/cassandra/db/ColumnFamily.java
@@ -28,12 +28,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.UUID;
 
-import com.google.common.base.Function;
-import com.google.common.base.Functions;
 import com.google.common.collect.ImmutableMap;
-
-import org.apache.cassandra.utils.memory.AbstractAllocator;
-import org.apache.cassandra.utils.memory.HeapAllocator;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 
 import org.apache.cassandra.cache.IRowCacheEntry;
@@ -125,11 +120,6 @@ public abstract class ColumnFamily implements Iterable<Cell>, IRowCacheEntry
         }
     }
 
-    public void addColumn(Cell cell)
-    {
-        addColumn(cell, HeapAllocator.instance);
-    }
-
     public void addColumn(CellName name, ByteBuffer value, long timestamp)
     {
         addColumn(name, value, timestamp, 0);
@@ -210,7 +200,7 @@ public abstract class ColumnFamily implements Iterable<Cell>, IRowCacheEntry
      * If a cell with the same name is already present in the map, it will
      * be replaced by the newly added cell.
      */
-    public abstract void addColumn(Cell cell, AbstractAllocator allocator);
+    public abstract void addColumn(Cell cell);
 
     /**
      * Adds all the columns of a given column map to this column map.
@@ -221,14 +211,7 @@ public abstract class ColumnFamily implements Iterable<Cell>, IRowCacheEntry
      *   </code>
      *  but is potentially faster.
      */
-    public abstract void addAll(ColumnFamily cm, AbstractAllocator allocator, Function<Cell, Cell> transformation);
-
-    /**
-     * Replace oldCell if present by newCell.
-     * Returns true if oldCell was present and thus replaced.
-     * oldCell and newCell should have the same name.
-     */
-    public abstract boolean replace(Cell oldCell, Cell newCell);
+    public abstract void addAll(ColumnFamily cm);
 
     /**
      * Get a column given its name, returning null if the column is not
@@ -294,11 +277,6 @@ public abstract class ColumnFamily implements Iterable<Cell>, IRowCacheEntry
         delete(columns.deletionInfo());
     }
 
-    public void addAll(ColumnFamily cf, AbstractAllocator allocator)
-    {
-        addAll(cf, allocator, Functions.<Cell>identity());
-    }
-
     /*
      * This function will calculate the difference between 2 column families.
      * The external input is assumed to be a superset of internal.
@@ -381,7 +359,7 @@ public abstract class ColumnFamily implements Iterable<Cell>, IRowCacheEntry
     public String toString()
     {
         StringBuilder sb = new StringBuilder("ColumnFamily(");
-        sb.append(metadata == null ? "<anonymous>" : metadata.cfName);
+        sb.append(metadata.cfName);
 
         if (isMarkedForDelete())
             sb.append(" -").append(deletionInfo()).append("-");
@@ -413,15 +391,10 @@ public abstract class ColumnFamily implements Iterable<Cell>, IRowCacheEntry
 
     public void resolve(ColumnFamily cf)
     {
-        resolve(cf, HeapAllocator.instance);
-    }
-
-    public void resolve(ColumnFamily cf, AbstractAllocator allocator)
-    {
         // Row _does_ allow null CF objects :(  seems a necessary evil for efficiency
         if (cf == null)
             return;
-        addAll(cf, allocator);
+        addAll(cf);
     }
 
     public ColumnStats getColumnStats()
@@ -485,21 +458,6 @@ public abstract class ColumnFamily implements Iterable<Cell>, IRowCacheEntry
         return getReverseSortedColumns().iterator();
     }
 
-    public boolean hasIrrelevantData(int gcBefore)
-    {
-        // Do we have gcable deletion infos?
-        if (deletionInfo().hasPurgeableTombstones(gcBefore))
-            return true;
-
-        // Do we have colums that are either deleted by the container or gcable tombstone?
-        DeletionInfo.InOrderTester tester = inOrderDeletionTester();
-        for (Cell cell : this)
-            if (tester.isDeleted(cell) || cell.hasIrrelevantData(gcBefore))
-                return true;
-
-        return false;
-    }
-
     public Map<CellName, ByteBuffer> asMap()
     {
         ImmutableMap.Builder<CellName, ByteBuffer> builder = ImmutableMap.builder();

http://git-wip-us.apache.org/repos/asf/cassandra/blob/0e43885a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
index 961d126..0b3f64e 100644
--- a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
+++ b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
@@ -33,13 +33,6 @@ import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Function;
 import com.google.common.collect.*;
 import com.google.common.util.concurrent.*;
-import org.apache.cassandra.concurrent.NamedThreadFactory;
-import org.apache.cassandra.utils.concurrent.OpOrder;
-import org.apache.cassandra.concurrent.StageManager;
-import org.apache.cassandra.db.filter.ColumnSlice;
-import org.apache.cassandra.db.filter.SliceQueryFilter;
-import org.apache.cassandra.utils.memory.HeapAllocator;
-
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.Striped;
 import com.google.common.util.concurrent.Uninterruptibles;
@@ -48,19 +41,22 @@ import org.slf4j.LoggerFactory;
 
 import org.apache.cassandra.cache.*;
 import org.apache.cassandra.concurrent.JMXEnabledThreadPoolExecutor;
+import org.apache.cassandra.concurrent.NamedThreadFactory;
+import org.apache.cassandra.concurrent.StageManager;
 import org.apache.cassandra.config.*;
 import org.apache.cassandra.config.CFMetaData.SpeculativeRetry;
 import org.apache.cassandra.db.columniterator.OnDiskAtomIterator;
 import org.apache.cassandra.db.commitlog.CommitLog;
 import org.apache.cassandra.db.commitlog.ReplayPosition;
 import org.apache.cassandra.db.compaction.*;
-import org.apache.cassandra.db.filter.ExtendedFilter;
-import org.apache.cassandra.db.filter.IDiskAtomFilter;
-import org.apache.cassandra.db.filter.QueryFilter;
 import org.apache.cassandra.db.composites.CellName;
-import org.apache.cassandra.db.composites.Composites;
 import org.apache.cassandra.db.composites.CellNameType;
 import org.apache.cassandra.db.composites.Composite;
+import org.apache.cassandra.db.filter.ColumnSlice;
+import org.apache.cassandra.db.filter.ExtendedFilter;
+import org.apache.cassandra.db.filter.IDiskAtomFilter;
+import org.apache.cassandra.db.filter.QueryFilter;
+import org.apache.cassandra.db.filter.SliceQueryFilter;
 import org.apache.cassandra.db.index.SecondaryIndex;
 import org.apache.cassandra.db.index.SecondaryIndexManager;
 import org.apache.cassandra.dht.*;
@@ -74,13 +70,12 @@ import org.apache.cassandra.io.sstable.metadata.CompactionMetadata;
 import org.apache.cassandra.io.sstable.metadata.MetadataType;
 import org.apache.cassandra.io.util.FileUtils;
 import org.apache.cassandra.metrics.ColumnFamilyMetrics;
-import org.apache.cassandra.service.ActiveRepairService;
 import org.apache.cassandra.service.CacheService;
 import org.apache.cassandra.service.StorageService;
-
 import org.apache.cassandra.streaming.StreamLockfile;
 import org.apache.cassandra.tracing.Tracing;
 import org.apache.cassandra.utils.*;
+import org.apache.cassandra.utils.concurrent.OpOrder;
 
 import static org.apache.cassandra.config.CFMetaData.Caching;
 
@@ -2066,7 +2061,7 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean
                     {
                         ColumnFamily cf = filter.cfs.getColumnFamily(new QueryFilter(rawRow.key, name, extraFilter, filter.timestamp));
                         if (cf != null)
-                            data.addAll(cf, HeapAllocator.instance);
+                            data.addAll(cf);
                     }
 
                     removeDroppedColumns(data);

http://git-wip-us.apache.org/repos/asf/cassandra/blob/0e43885a/src/java/org/apache/cassandra/db/EmptyColumns.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/EmptyColumns.java b/src/java/org/apache/cassandra/db/EmptyColumns.java
index 5021f39..fa6ea1b 100644
--- a/src/java/org/apache/cassandra/db/EmptyColumns.java
+++ b/src/java/org/apache/cassandra/db/EmptyColumns.java
@@ -1,4 +1,3 @@
-package org.apache.cassandra.db;
 /*
  * 
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -19,19 +18,17 @@ package org.apache.cassandra.db;
  * under the License.
  * 
  */
-
+package org.apache.cassandra.db;
 
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Iterator;
 
+import com.google.common.collect.Iterators;
+
 import org.apache.cassandra.config.CFMetaData;
 import org.apache.cassandra.db.composites.CellName;
 import org.apache.cassandra.db.filter.ColumnSlice;
-import org.apache.cassandra.utils.memory.AbstractAllocator;
-
-import com.google.common.base.Function;
-import com.google.common.collect.Iterators;
 
 public class EmptyColumns extends AbstractThreadUnsafeSortedColumns
 {
@@ -63,17 +60,12 @@ public class EmptyColumns extends AbstractThreadUnsafeSortedColumns
         return factory;
     }
 
-    public void addColumn(Cell cell, AbstractAllocator allocator)
-    {
-        throw new UnsupportedOperationException();
-    }
-
-    public void addAll(ColumnFamily cm, AbstractAllocator allocator, Function<Cell, Cell> transformation)
+    public void addColumn(Cell cell)
     {
         throw new UnsupportedOperationException();
     }
 
-    public boolean replace(Cell oldCell, Cell newCell)
+    public void addAll(ColumnFamily cm)
     {
         throw new UnsupportedOperationException();
     }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/0e43885a/src/java/org/apache/cassandra/db/TreeMapBackedSortedColumns.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/TreeMapBackedSortedColumns.java b/src/java/org/apache/cassandra/db/TreeMapBackedSortedColumns.java
index 09c50fa..dadb021 100644
--- a/src/java/org/apache/cassandra/db/TreeMapBackedSortedColumns.java
+++ b/src/java/org/apache/cassandra/db/TreeMapBackedSortedColumns.java
@@ -23,13 +23,10 @@ import java.util.SortedMap;
 import java.util.SortedSet;
 import java.util.TreeMap;
 
-import com.google.common.base.Function;
-
 import org.apache.cassandra.config.CFMetaData;
 import org.apache.cassandra.db.composites.CellName;
-import org.apache.cassandra.db.composites.CellNameType;
 import org.apache.cassandra.db.filter.ColumnSlice;
-import org.apache.cassandra.utils.memory.AbstractAllocator;
+import org.apache.cassandra.utils.memory.HeapAllocator;
 
 public class TreeMapBackedSortedColumns extends AbstractThreadUnsafeSortedColumns
 {
@@ -44,11 +41,6 @@ public class TreeMapBackedSortedColumns extends AbstractThreadUnsafeSortedColumn
         }
     };
 
-    public CellNameType getComparator()
-    {
-        return (CellNameType)map.comparator();
-    }
-
     private TreeMapBackedSortedColumns(CFMetaData metadata)
     {
         super(metadata);
@@ -80,7 +72,7 @@ public class TreeMapBackedSortedColumns extends AbstractThreadUnsafeSortedColumn
      * If we find an old cell that has the same name
      * the ask it to resolve itself else add the new cell
     */
-    public void addColumn(Cell cell, AbstractAllocator allocator)
+    public void addColumn(Cell cell)
     {
         CellName name = cell.name();
         // this is a slightly unusual way to structure this; a more natural way is shown in ThreadSafeSortedColumns,
@@ -92,40 +84,17 @@ public class TreeMapBackedSortedColumns extends AbstractThreadUnsafeSortedColumn
             return;
 
         // calculate reconciled col from old (existing) col and new col
-        map.put(name, cell.reconcile(oldCell, allocator));
+        map.put(name, cell.reconcile(oldCell, HeapAllocator.instance));
     }
 
     /**
      * We need to go through each column in the column container and resolve it before adding
      */
-    public void addAll(ColumnFamily cm, AbstractAllocator allocator, Function<Cell, Cell> transformation)
+    public void addAll(ColumnFamily cm)
     {
         delete(cm.deletionInfo());
         for (Cell cell : cm)
-            addColumn(transformation.apply(cell), allocator);
-    }
-
-    public boolean replace(Cell oldCell, Cell newCell)
-    {
-        if (!oldCell.name().equals(newCell.name()))
-            throw new IllegalArgumentException();
-
-        // We are not supposed to put the newCell is either there was not
-        // column or the column was not equal to oldCell (to be coherent
-        // with other implementation). We optimize for the common case where
-        // oldCell do is present though.
-        Cell previous = map.put(oldCell.name(), newCell);
-        if (previous == null)
-        {
-            map.remove(oldCell.name());
-            return false;
-        }
-        if (!previous.equals(oldCell))
-        {
-            map.put(oldCell.name(), previous);
-            return false;
-        }
-        return true;
+            addColumn(cell);
     }
 
     public Cell getColumn(CellName name)
@@ -159,11 +128,6 @@ public class TreeMapBackedSortedColumns extends AbstractThreadUnsafeSortedColumn
         return map.navigableKeySet();
     }
 
-    public Iterator<Cell> iterator()
-    {
-        return map.values().iterator();
-    }
-
     public Iterator<Cell> iterator(ColumnSlice[] slices)
     {
         return new ColumnSlice.NavigableMapIterator(map, slices);
@@ -173,5 +137,4 @@ public class TreeMapBackedSortedColumns extends AbstractThreadUnsafeSortedColumn
     {
         return new ColumnSlice.NavigableMapIterator(map.descendingMap(), slices);
     }
-
 }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/0e43885a/src/java/org/apache/cassandra/db/index/keys/KeysSearcher.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/index/keys/KeysSearcher.java b/src/java/org/apache/cassandra/db/index/keys/KeysSearcher.java
index d491c93..f08ba4d 100644
--- a/src/java/org/apache/cassandra/db/index/keys/KeysSearcher.java
+++ b/src/java/org/apache/cassandra/db/index/keys/KeysSearcher.java
@@ -24,8 +24,6 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
 
-import org.apache.cassandra.utils.concurrent.OpOrder;
-
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -40,7 +38,7 @@ import org.apache.cassandra.db.filter.QueryFilter;
 import org.apache.cassandra.db.index.*;
 import org.apache.cassandra.dht.AbstractBounds;
 import org.apache.cassandra.dht.Range;
-import org.apache.cassandra.utils.memory.HeapAllocator;
+import org.apache.cassandra.utils.concurrent.OpOrder;
 
 public class KeysSearcher extends SecondaryIndexSearcher
 {
@@ -182,7 +180,7 @@ public class KeysSearcher extends SecondaryIndexSearcher
                         {
                             ColumnFamily cf = baseCfs.getColumnFamily(new QueryFilter(dk, baseCfs.name, extraFilter, filter.timestamp));
                             if (cf != null)
-                                data.addAll(cf, HeapAllocator.instance);
+                                data.addAll(cf);
                         }
 
                         if (((KeysIndex)index).isIndexEntryStale(indexKey.key, data, filter.timestamp))

http://git-wip-us.apache.org/repos/asf/cassandra/blob/0e43885a/test/unit/org/apache/cassandra/db/ArrayBackedSortedColumnsTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/db/ArrayBackedSortedColumnsTest.java b/test/unit/org/apache/cassandra/db/ArrayBackedSortedColumnsTest.java
index cd837c8..d98dab6 100644
--- a/test/unit/org/apache/cassandra/db/ArrayBackedSortedColumnsTest.java
+++ b/test/unit/org/apache/cassandra/db/ArrayBackedSortedColumnsTest.java
@@ -1,4 +1,3 @@
-package org.apache.cassandra.db;
 /*
  *
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -19,23 +18,19 @@ package org.apache.cassandra.db;
  * under the License.
  *
  */
-
+package org.apache.cassandra.db;
 
 import java.util.*;
-
 import org.junit.Test;
 
 import static org.junit.Assert.*;
 
-import com.google.common.base.Functions;
-
 import org.apache.cassandra.SchemaLoader;
 import org.apache.cassandra.config.CFMetaData;
 import org.apache.cassandra.config.Schema;
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.db.composites.*;
 import org.apache.cassandra.db.filter.ColumnSlice;
-import org.apache.cassandra.utils.memory.HeapAllocator;
 import org.apache.cassandra.db.marshal.Int32Type;
 
 public class ArrayBackedSortedColumnsTest extends SchemaLoader
@@ -59,7 +54,7 @@ public class ArrayBackedSortedColumnsTest extends SchemaLoader
         int[] values = new int[]{ 1, 2, 2, 3 };
 
         for (int i = 0; i < values.length; ++i)
-            map.addColumn(new Cell(type.makeCellName(values[reversed ? values.length - 1 - i : i])), HeapAllocator.instance);
+            map.addColumn(new Cell(type.makeCellName(values[reversed ? values.length - 1 - i : i])));
 
         Iterator<Cell> iter = map.iterator();
         assertEquals("1st column", 1, iter.next().name().toByteBuffer().getInt(0));
@@ -84,12 +79,12 @@ public class ArrayBackedSortedColumnsTest extends SchemaLoader
         int[] values2 = new int[]{ 2, 4, 5, 6 };
 
         for (int i = 0; i < values1.length; ++i)
-            map.addColumn(new Cell(type.makeCellName(values1[reversed ? values1.length - 1 - i : i])), HeapAllocator.instance);
+            map.addColumn(new Cell(type.makeCellName(values1[reversed ? values1.length - 1 - i : i])));
 
         for (int i = 0; i < values2.length; ++i)
-            map2.addColumn(new Cell(type.makeCellName(values2[reversed ? values2.length - 1 - i : i])), HeapAllocator.instance);
+            map2.addColumn(new Cell(type.makeCellName(values2[reversed ? values2.length - 1 - i : i])));
 
-        map2.addAll(map, HeapAllocator.instance, Functions.<Cell>identity());
+        map2.addAll(map);
 
         Iterator<Cell> iter = map2.iterator();
         assertEquals("1st column", 1, iter.next().name().toByteBuffer().getInt(0));
@@ -113,14 +108,14 @@ public class ArrayBackedSortedColumnsTest extends SchemaLoader
         ColumnFamily map = ArrayBackedSortedColumns.factory.create(metadata(), reversed);
         int[] values = new int[]{ 1, 2, 3, 5, 9 };
 
-        List<Cell> sorted = new ArrayList<Cell>();
+        List<Cell> sorted = new ArrayList<>();
         for (int v : values)
             sorted.add(new Cell(type.makeCellName(v)));
-        List<Cell> reverseSorted = new ArrayList<Cell>(sorted);
+        List<Cell> reverseSorted = new ArrayList<>(sorted);
         Collections.reverse(reverseSorted);
 
         for (int i = 0; i < values.length; ++i)
-            map.addColumn(new Cell(type.makeCellName(values[reversed ? values.length - 1 - i : i])), HeapAllocator.instance);
+            map.addColumn(new Cell(type.makeCellName(values[reversed ? values.length - 1 - i : i])));
 
         assertSame(sorted, map.getSortedColumns());
         assertSame(reverseSorted, map.getReverseSortedColumns());
@@ -141,7 +136,7 @@ public class ArrayBackedSortedColumnsTest extends SchemaLoader
         int[] values = new int[]{ 1, 2, 3, 5, 9 };
 
         for (int i = 0; i < values.length; ++i)
-            map.addColumn(new Cell(type.makeCellName(values[reversed ? values.length - 1 - i : i])), HeapAllocator.instance);
+            map.addColumn(new Cell(type.makeCellName(values[reversed ? values.length - 1 - i : i])));
 
         assertSame(new int[]{ 3, 2, 1 }, map.reverseIterator(new ColumnSlice[]{ new ColumnSlice(type.make(3), Composites.EMPTY) }));
         assertSame(new int[]{ 3, 2, 1 }, map.reverseIterator(new ColumnSlice[]{ new ColumnSlice(type.make(4), Composites.EMPTY) }));
@@ -187,7 +182,7 @@ public class ArrayBackedSortedColumnsTest extends SchemaLoader
         int[] values = new int[]{ 1, 2, 2, 3 };
 
         for (int i = 0; i < values.length; ++i)
-            map.addColumn(new Cell(type.makeCellName(values[reversed ? values.length - 1 - i : i])), HeapAllocator.instance);
+            map.addColumn(new Cell(type.makeCellName(values[reversed ? values.length - 1 - i : i])));
 
         Iterator<Cell> iter = map.getReverseSortedColumns().iterator();
         assertTrue(iter.hasNext());

http://git-wip-us.apache.org/repos/asf/cassandra/blob/0e43885a/test/unit/org/apache/cassandra/db/ColumnFamilyTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/db/ColumnFamilyTest.java b/test/unit/org/apache/cassandra/db/ColumnFamilyTest.java
index cd79217..ae2a461 100644
--- a/test/unit/org/apache/cassandra/db/ColumnFamilyTest.java
+++ b/test/unit/org/apache/cassandra/db/ColumnFamilyTest.java
@@ -25,21 +25,18 @@ import java.nio.ByteBuffer;
 import java.util.*;
 
 import com.google.common.collect.Iterables;
-
-import org.apache.cassandra.SchemaLoader;
 import org.junit.Test;
 
+import org.apache.cassandra.SchemaLoader;
 import org.apache.cassandra.io.sstable.ColumnStats;
 import org.apache.cassandra.io.util.DataOutputBuffer;
 import org.apache.cassandra.net.MessagingService;
+import org.apache.cassandra.utils.ByteBufferUtil;
+
 import static org.apache.cassandra.Util.column;
 import static org.apache.cassandra.Util.cellname;
 import static org.junit.Assert.assertEquals;
 
-import org.apache.cassandra.utils.ByteBufferUtil;
-import org.apache.cassandra.utils.memory.HeapAllocator;
-
-
 public class ColumnFamilyTest extends SchemaLoader
 {
     static int version = MessagingService.current_version;
@@ -68,7 +65,7 @@ public class ColumnFamilyTest extends SchemaLoader
     {
         ColumnFamily cf;
 
-        TreeMap<String, String> map = new TreeMap<String, String>();
+        TreeMap<String, String> map = new TreeMap<>();
         for (int i = 100; i < 1000; ++i)
         {
             map.put(Integer.toString(i), "Avinash Lakshman is a good man: " + i);
@@ -134,8 +131,8 @@ public class ColumnFamilyTest extends SchemaLoader
         cf_old.addColumn(cellname("col2"), val2, 1);
         cf_old.addColumn(cellname("col3"), val2, 2);
 
-        cf_result.addAll(cf_new, HeapAllocator.instance);
-        cf_result.addAll(cf_old, HeapAllocator.instance);
+        cf_result.addAll(cf_new);
+        cf_result.addAll(cf_old);
 
         assert 3 == cf_result.getColumnCount() : "Count is " + cf_new.getColumnCount();
         //addcolumns will only add if timestamp >= old timestamp