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 2015/01/26 22:23:17 UTC

cassandra git commit: Simplify logic of ABSC#BatchRemoveIterator#commit()

Repository: cassandra
Updated Branches:
  refs/heads/cassandra-2.0 2bf63f61e -> b077cda83


Simplify logic of ABSC#BatchRemoveIterator#commit()

patch by Aleksey Yeschenko; reviewed by Joshua McKenzie for
CASSANDRA-8666


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

Branch: refs/heads/cassandra-2.0
Commit: b077cda83bb1d32d5e6836027cfdfe3009b266b4
Parents: 2bf63f6
Author: Aleksey Yeschenko <al...@apache.org>
Authored: Tue Jan 27 00:20:38 2015 +0300
Committer: Aleksey Yeschenko <al...@apache.org>
Committed: Tue Jan 27 00:20:38 2015 +0300

----------------------------------------------------------------------
 CHANGES.txt                                     |  2 +-
 .../cassandra/db/ArrayBackedSortedColumns.java  | 53 +++++++-------------
 2 files changed, 20 insertions(+), 35 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/b077cda8/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 0d08cce..792f8c1 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,6 +1,6 @@
 2.0.13:
  * Round up time deltas lower than 1ms in BulkLoader (CASSANDRA-8645)
- * Add batch remove iterator to ABSC (CASSANDRA-8414)
+ * Add batch remove iterator to ABSC (CASSANDRA-8414, 8666)
 
 
 2.0.12:

http://git-wip-us.apache.org/repos/asf/cassandra/blob/b077cda8/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 8d553be..482f04f 100644
--- a/src/java/org/apache/cassandra/db/ArrayBackedSortedColumns.java
+++ b/src/java/org/apache/cassandra/db/ArrayBackedSortedColumns.java
@@ -314,43 +314,28 @@ public class ArrayBackedSortedColumns extends AbstractThreadUnsafeSortedColumns
                 if (!removedAnything)
                     return;
 
-                // the lowest index both not visited and known to be not removed
-                int keepIdx = removedIndexes.nextClearBit(0);
-                // the running total of kept items
-                int resultLength = 0;
-                // start from the first not-removed cell, and shift left.
-                int removeIdx = removedIndexes.nextSetBit(keepIdx + 1);
-                while (removeIdx >= 0)
-                {
-                    int length = removeIdx - keepIdx;
-                    if (length > 0)
-                    {
-                        copy(keepIdx, resultLength, length);
-                        resultLength += length;
-                    }
-                    keepIdx = removedIndexes.nextClearBit(removeIdx + 1);
-                    if (keepIdx < 0)
-                        keepIdx = columns.size();
-                    removeIdx = removedIndexes.nextSetBit(keepIdx + 1);
-                }
-                // Copy everything after the last deleted column
-                int length = columns.size() - keepIdx;
-                if (length > 0)
+                int size = columns.size();
+                int retainedCount = 0;
+                int clearIdx, setIdx = -1;
+
+                // shift all [clearIdx, setIdx) segments to the left, skipping any removed columns
+                while (true)
                 {
-                    copy(keepIdx, resultLength, length);
-                    resultLength += length;
+                    clearIdx = removedIndexes.nextClearBit(setIdx + 1);
+                    if (clearIdx >= size)
+                        break; // nothing left to retain
+
+                    setIdx = removedIndexes.nextSetBit(clearIdx + 1);
+                    if (setIdx < 0)
+                        setIdx = size; // no removals past retainIdx - copy all remaining cells
+
+                    if (retainedCount != clearIdx)
+                        Collections.copy(columns.subList(retainedCount, retainedCount + setIdx - clearIdx),
+                                         columns.subList(clearIdx, setIdx));
+                    retainedCount += (setIdx - clearIdx);
                 }
 
-                columns.subList(resultLength, columns.size()).clear();
-            }
-
-            private void copy(int src, int dst, int len)
-            {
-                // [src, src+len) and [dst, dst+len) might overlap, but it's okay because we're going from left to right
-                assert dst <= src : "dst must not be greater than src";
-
-                if (dst < src)
-                    Collections.copy(columns.subList(dst, dst + len), columns.subList(src, src + len));
+                columns.subList(retainedCount, size).clear();
             }
 
             public boolean hasNext()