Repository: cassandra
Updated Branches:
  refs/heads/trunk 7c730279e -> 3d7c5fdd3


Fast ABSC.addAll() path + ASPCSI optimization

patch by Benedict Elliott Smith; reviewed by Aleksey Yeschenko


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

Branch: refs/heads/trunk
Commit: 6ed241acb33087e6cedf8f4637aca5dce0fe502c
Parents: e69e526
Author: Aleksey Yeschenko <alek...@apache.org>
Authored: Thu Feb 20 21:33:28 2014 +0300
Committer: Aleksey Yeschenko <alek...@apache.org>
Committed: Thu Feb 20 21:35:33 2014 +0300

----------------------------------------------------------------------
 .../cassandra/db/ArrayBackedSortedColumns.java  | 44 ++++++++++++++++----
 .../apache/cassandra/db/AtomicBTreeColumns.java |  2 +-
 .../org/apache/cassandra/db/ColumnFamily.java   |  7 +++-
 .../AbstractSimplePerColumnSecondaryIndex.java  | 19 +--------
 4 files changed, 46 insertions(+), 26 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/6ed241ac/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 0ce36e2..1fdebd8 100644
--- a/src/java/org/apache/cassandra/db/ArrayBackedSortedColumns.java
+++ b/src/java/org/apache/cassandra/db/ArrayBackedSortedColumns.java
@@ -52,18 +52,18 @@ public class ArrayBackedSortedColumns extends ColumnFamily
 
     public static final ColumnFamily.Factory<ArrayBackedSortedColumns> factory 
= new Factory<ArrayBackedSortedColumns>()
     {
-        public ArrayBackedSortedColumns create(CFMetaData metadata, boolean 
insertReversed)
+        public ArrayBackedSortedColumns create(CFMetaData metadata, boolean 
insertReversed, int initialCapacity)
         {
-            return new ArrayBackedSortedColumns(metadata, insertReversed);
+            return new ArrayBackedSortedColumns(metadata, insertReversed, 
initialCapacity);
         }
     };
 
-    private ArrayBackedSortedColumns(CFMetaData metadata, boolean reversed)
+    private ArrayBackedSortedColumns(CFMetaData metadata, boolean reversed, 
int initialCapacity)
     {
         super(metadata);
         this.reversed = reversed;
         this.deletionInfo = DeletionInfo.live();
-        this.cells = EMPTY_ARRAY;
+        this.cells = initialCapacity == 0 ? EMPTY_ARRAY : new 
Cell[initialCapacity];
         this.size = 0;
         this.sortedSize = 0;
         this.isSorted = true;
@@ -235,9 +235,39 @@ public class ArrayBackedSortedColumns extends ColumnFamily
         if (other.getColumnCount() == 0)
             return;
 
-        Iterator<Cell> iterator = reversed ? other.reverseIterator() : 
other.iterator();
-        while (iterator.hasNext())
-            addColumn(iterator.next());
+        // In reality, with ABSC being the only remaining container (aside 
from ABTC), other will aways be ABSC.
+        if (size == 0 && other instanceof ArrayBackedSortedColumns)
+        {
+            fastAddAll((ArrayBackedSortedColumns) other);
+        }
+        else
+        {
+            Iterator<Cell> iterator = reversed ? other.reverseIterator() : 
other.iterator();
+            while (iterator.hasNext())
+                addColumn(iterator.next());
+        }
+    }
+
+    // Fast path, when this ABSC is empty.
+    private void fastAddAll(ArrayBackedSortedColumns other)
+    {
+        if (other.isInsertReversed() == isInsertReversed())
+        {
+            cells = Arrays.copyOf(other.cells, other.cells.length);
+            size = other.size;
+            sortedSize = other.sortedSize;
+            isSorted = other.isSorted;
+        }
+        else
+        {
+            if (cells.length < other.getColumnCount())
+                cells = new Cell[Math.max(MINIMAL_CAPACITY, 
other.getColumnCount())];
+            Iterator<Cell> iterator = reversed ? other.reverseIterator() : 
other.iterator();
+            while (iterator.hasNext())
+                cells[size++] = iterator.next();
+            sortedSize = size;
+            isSorted = true;
+        }
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/cassandra/blob/6ed241ac/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 f75efd2..5cc43d9 100644
--- a/src/java/org/apache/cassandra/db/AtomicBTreeColumns.java
+++ b/src/java/org/apache/cassandra/db/AtomicBTreeColumns.java
@@ -66,7 +66,7 @@ public class AtomicBTreeColumns extends ColumnFamily
 
     public static final Factory<AtomicBTreeColumns> factory = new 
Factory<AtomicBTreeColumns>()
     {
-        public AtomicBTreeColumns create(CFMetaData metadata, boolean 
insertReversed)
+        public AtomicBTreeColumns create(CFMetaData metadata, boolean 
insertReversed, int initialCapacity)
         {
             if (insertReversed)
                 throw new IllegalArgumentException();

http://git-wip-us.apache.org/repos/asf/cassandra/blob/6ed241ac/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 3437410..8762462 100644
--- a/src/java/org/apache/cassandra/db/ColumnFamily.java
+++ b/src/java/org/apache/cassandra/db/ColumnFamily.java
@@ -493,7 +493,12 @@ public abstract class ColumnFamily implements 
Iterable<Cell>, IRowCacheEntry
          * allow optimizing for both forward and reversed slices. This does 
not matter for ThreadSafeSortedColumns.
          * Note that this is only an hint on how we expect to do insertion, 
this does not change the map sorting.
          */
-        public abstract T create(CFMetaData metadata, boolean insertReversed);
+        public abstract T create(CFMetaData metadata, boolean insertReversed, 
int initialCapacity);
+
+        public T create(CFMetaData metadata, boolean insertReversed)
+        {
+            return create(metadata, insertReversed, 0);
+        }
 
         public T create(CFMetaData metadata)
         {

http://git-wip-us.apache.org/repos/asf/cassandra/blob/6ed241ac/src/java/org/apache/cassandra/db/index/AbstractSimplePerColumnSecondaryIndex.java
----------------------------------------------------------------------
diff --git 
a/src/java/org/apache/cassandra/db/index/AbstractSimplePerColumnSecondaryIndex.java
 
b/src/java/org/apache/cassandra/db/index/AbstractSimplePerColumnSecondaryIndex.java
index e2a6608..9788168 100644
--- 
a/src/java/org/apache/cassandra/db/index/AbstractSimplePerColumnSecondaryIndex.java
+++ 
b/src/java/org/apache/cassandra/db/index/AbstractSimplePerColumnSecondaryIndex.java
@@ -86,21 +86,6 @@ public abstract class AbstractSimplePerColumnSecondaryIndex 
extends PerColumnSec
                              
baseCfs.metadata.getColumnDefinition(expr.column).type.getString(expr.value));
     }
 
-    public void delete(ByteBuffer rowKey, Cell cell)
-    {
-        throw new IllegalStateException();
-    }
-
-    public void insert(ByteBuffer rowKey, Cell cell)
-    {
-        throw new IllegalStateException();
-    }
-
-    public void update(ByteBuffer rowKey, Cell cell)
-    {
-        throw new IllegalStateException();
-    }
-
     public void delete(ByteBuffer rowKey, Cell cell, OpOrder.Group opGroup)
     {
         if (cell.isMarkedForDelete(System.currentTimeMillis()))
@@ -108,7 +93,7 @@ public abstract class AbstractSimplePerColumnSecondaryIndex 
extends PerColumnSec
 
         DecoratedKey valueKey = getIndexKeyFor(getIndexedValue(rowKey, cell));
         int localDeletionTime = (int) (System.currentTimeMillis() / 1000);
-        ColumnFamily cfi = 
ArrayBackedSortedColumns.factory.create(indexCfs.metadata);
+        ColumnFamily cfi = 
ArrayBackedSortedColumns.factory.create(indexCfs.metadata, false, 1);
         cfi.addTombstone(makeIndexColumnName(rowKey, cell), localDeletionTime, 
cell.timestamp());
         indexCfs.apply(valueKey, cfi, SecondaryIndexManager.nullUpdater, 
opGroup, null);
         if (logger.isDebugEnabled())
@@ -118,7 +103,7 @@ public abstract class AbstractSimplePerColumnSecondaryIndex 
extends PerColumnSec
     public void insert(ByteBuffer rowKey, Cell cell, OpOrder.Group opGroup)
     {
         DecoratedKey valueKey = getIndexKeyFor(getIndexedValue(rowKey, cell));
-        ColumnFamily cfi = 
ArrayBackedSortedColumns.factory.create(indexCfs.metadata);
+        ColumnFamily cfi = 
ArrayBackedSortedColumns.factory.create(indexCfs.metadata, false, 1);
         CellName name = makeIndexColumnName(rowKey, cell);
         if (cell instanceof ExpiringCell)
         {

Reply via email to