Avoid calling iter.next() in a loop when notifying indexers about range tombstones
Patch by marcuse; reviewed by Alex Petrov and Sam Tunnicliffe for CASSANDRA-14794 Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/30d28358 Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/30d28358 Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/30d28358 Branch: refs/heads/trunk Commit: 30d2835809e119173b1124b3eecb134e3a8c19b6 Parents: d496dca Author: Marcus Eriksson <[email protected]> Authored: Thu Sep 27 11:23:03 2018 +0200 Committer: Marcus Eriksson <[email protected]> Committed: Fri Sep 28 12:52:20 2018 +0200 ---------------------------------------------------------------------- CHANGES.txt | 1 + .../cassandra/index/SecondaryIndexManager.java | 5 ++- .../apache/cassandra/index/CustomIndexTest.java | 32 ++++++++++++++++++++ 3 files changed, 37 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/30d28358/CHANGES.txt ---------------------------------------------------------------------- diff --git a/CHANGES.txt b/CHANGES.txt index 2c2f4f5..70b2996 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 3.0.18 + * Avoid calling iter.next() in a loop when notifying indexers about range tombstones (CASSANDRA-14794) * Fix purging semi-expired RT boundaries in reversed iterators (CASSANDRA-14672) * DESC order reads can fail to return the last Unfiltered in the partition (CASSANDRA-14766) * Fix corrupted collection deletions for dropped columns in 3.0 <-> 2.{1,2} messages (CASSANDRA-14568) http://git-wip-us.apache.org/repos/asf/cassandra/blob/30d28358/src/java/org/apache/cassandra/index/SecondaryIndexManager.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/index/SecondaryIndexManager.java b/src/java/org/apache/cassandra/index/SecondaryIndexManager.java index 5976ddf..c5ecd25 100644 --- a/src/java/org/apache/cassandra/index/SecondaryIndexManager.java +++ b/src/java/org/apache/cassandra/index/SecondaryIndexManager.java @@ -596,7 +596,10 @@ public class SecondaryIndexManager implements IndexRegistry { Iterator<RangeTombstone> iter = deletionInfo.rangeIterator(false); while (iter.hasNext()) - indexers.forEach(indexer -> indexer.rangeTombstone(iter.next())); + { + RangeTombstone rt = iter.next(); + indexers.forEach(indexer -> indexer.rangeTombstone(rt)); + } } indexers.forEach(Index.Indexer::finish); http://git-wip-us.apache.org/repos/asf/cassandra/blob/30d28358/test/unit/org/apache/cassandra/index/CustomIndexTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/index/CustomIndexTest.java b/test/unit/org/apache/cassandra/index/CustomIndexTest.java index 81e1745..66e9fe5 100644 --- a/test/unit/org/apache/cassandra/index/CustomIndexTest.java +++ b/test/unit/org/apache/cassandra/index/CustomIndexTest.java @@ -28,6 +28,7 @@ import java.util.stream.Collectors; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Sets; import org.junit.Test; import com.datastax.driver.core.exceptions.QueryValidationException; @@ -792,6 +793,37 @@ public class CustomIndexTest extends CQLTester assertEquals(1, index.finishCalls); } + @Test + public void rangeTombstoneTest() throws Throwable + { + createTable("CREATE TABLE %s(k int, c int, v int, v2 int, PRIMARY KEY(k,c))"); + ColumnFamilyStore cfs = getCurrentColumnFamilyStore(); + SecondaryIndexManager indexManager = cfs.indexManager; + + // Insert a single range tombstone + execute("DELETE FROM %s WHERE k=1 and c > 2"); + cfs.forceBlockingFlush(); + + // Create the index, which won't automatically start building + String indexName = "range_tombstone_idx"; + createIndex(String.format("CREATE CUSTOM INDEX %s ON %%s(v) USING '%s'", + indexName, StubIndex.class.getName())); + String indexName2 = "range_tombstone_idx2"; + createIndex(String.format("CREATE CUSTOM INDEX %s ON %%s(v2) USING '%s'", + indexName2, StubIndex.class.getName())); + + StubIndex index = (StubIndex) indexManager.getIndexByName(indexName); + StubIndex index2 = (StubIndex) indexManager.getIndexByName(indexName2); + + // Index the partition + DecoratedKey targetKey = getCurrentColumnFamilyStore().decorateKey(ByteBufferUtil.bytes(1)); + indexManager.indexPartition(targetKey, Sets.newHashSet(index, index2), 1); + + // and both indexes should have the same range tombstone + assertEquals(index.rangeTombstones, index2.rangeTombstones); + } + + // Used for index creation above public static class BrokenCustom2I extends StubIndex { --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
