Updated Branches: refs/heads/trunk 5edf94842 -> 2fd2d8978
Fixup for 6271 Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/2fd2d897 Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/2fd2d897 Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/2fd2d897 Branch: refs/heads/trunk Commit: 2fd2d89782b7d6fa36c0cb9c710711af39da35ed Parents: 5edf948 Author: Sylvain Lebresne <sylv...@datastax.com> Authored: Tue Jan 14 14:50:36 2014 +0100 Committer: Sylvain Lebresne <sylv...@datastax.com> Committed: Tue Jan 14 14:50:36 2014 +0100 ---------------------------------------------------------------------- .../apache/cassandra/db/AtomicBTreeColumns.java | 27 ++++++++++---------- .../org/apache/cassandra/utils/btree/BTree.java | 7 ++++- .../cassandra/utils/btree/NodeBuilder.java | 2 +- .../cassandra/utils/btree/ReplaceFunction.java | 7 ++++- 4 files changed, 26 insertions(+), 17 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/2fd2d897/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 6fe8758..c6067fb 100644 --- a/src/java/org/apache/cassandra/db/AtomicBTreeColumns.java +++ b/src/java/org/apache/cassandra/db/AtomicBTreeColumns.java @@ -183,24 +183,23 @@ public class AtomicBTreeColumns extends ColumnFamily this.indexer = indexer; } + public Cell apply(Cell inserted) + { + indexer.insert(inserted); + delta += inserted.dataSize(); + return transform.apply(inserted); + } + public Cell apply(Cell replaced, Cell update) { - if (replaced == null) - { - indexer.insert(update); - delta += update.dataSize(); - } + Cell reconciled = update.reconcile(replaced, allocator); + if (reconciled == update) + indexer.update(replaced, reconciled); else - { - Cell reconciled = update.reconcile(replaced, allocator); - if (reconciled == update) - indexer.update(replaced, reconciled); - else - indexer.update(update, reconciled); - delta += reconciled.dataSize() - replaced.dataSize(); - } + indexer.update(update, reconciled); + delta += reconciled.dataSize() - replaced.dataSize(); - return transform.apply(update); + return transform.apply(reconciled); } } http://git-wip-us.apache.org/repos/asf/cassandra/blob/2fd2d897/src/java/org/apache/cassandra/utils/btree/BTree.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/utils/btree/BTree.java b/src/java/org/apache/cassandra/utils/btree/BTree.java index 44f75b1..1721fb0 100644 --- a/src/java/org/apache/cassandra/utils/btree/BTree.java +++ b/src/java/org/apache/cassandra/utils/btree/BTree.java @@ -5,6 +5,7 @@ import java.util.Collection; import java.util.Comparator; import com.google.common.base.Function; +import com.google.common.collect.Collections2; public class BTree { @@ -128,7 +129,11 @@ public class BTree Function<?, Boolean> terminateEarly) { if (btree.length == 0) + { + if (replaceF != null) + updateWith = Collections2.transform(updateWith, replaceF); return build(updateWith, comparator, updateWithIsSorted); + } if (!updateWithIsSorted) updateWith = sorted(updateWith, comparator, updateWith.size()); @@ -168,7 +173,7 @@ public class BTree else if (replaceF != null) { // new element but still need to apply replaceF to handle indexing and size-tracking - v = replaceF.apply(null, v); + v = replaceF.apply(v); } merged[mergedCount++] = v; http://git-wip-us.apache.org/repos/asf/cassandra/blob/2fd2d897/src/java/org/apache/cassandra/utils/btree/NodeBuilder.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/utils/btree/NodeBuilder.java b/src/java/org/apache/cassandra/utils/btree/NodeBuilder.java index 5dbe5df..e526394 100644 --- a/src/java/org/apache/cassandra/utils/btree/NodeBuilder.java +++ b/src/java/org/apache/cassandra/utils/btree/NodeBuilder.java @@ -231,7 +231,7 @@ final class NodeBuilder { ensureRoom(buildKeyPosition + 1); if (replaceF != null) - key = replaceF.apply(null, (V) key); + key = replaceF.apply((V) key); buildKeys[buildKeyPosition++] = key; } http://git-wip-us.apache.org/repos/asf/cassandra/blob/2fd2d897/src/java/org/apache/cassandra/utils/btree/ReplaceFunction.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/utils/btree/ReplaceFunction.java b/src/java/org/apache/cassandra/utils/btree/ReplaceFunction.java index bf783b0..a193c31 100644 --- a/src/java/org/apache/cassandra/utils/btree/ReplaceFunction.java +++ b/src/java/org/apache/cassandra/utils/btree/ReplaceFunction.java @@ -1,12 +1,17 @@ package org.apache.cassandra.utils.btree; +import com.google.common.base.Function; + /** * An interface defining a function to be applied to both the object we are replacing in a BTree and * the object that is intended to replace it, returning the object to actually replace it. * + * If this is a new insertion, that is there is no object to replace, the one argument variant of + * the function will be called. + * * @param <V> */ -public interface ReplaceFunction<V> +public interface ReplaceFunction<V> extends Function<V, V> { V apply(V replaced, V update); }