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) {