You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by br...@apache.org on 2020/03/19 19:51:49 UTC

[cassandra] 01/02: Fixed empty check in TrieMemIndex due to potential state inconsistency in ConcurrentSkipListMap

This is an automated email from the ASF dual-hosted git repository.

brandonwilliams pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/cassandra.git

commit 731dfda99249c9b64fca5fa258c6078bfbe040ac
Author: Gianluca Righetto <gi...@menttis.com>
AuthorDate: Wed Mar 18 15:42:44 2020 -0300

    Fixed empty check in TrieMemIndex due to potential state inconsistency in ConcurrentSkipListMap
    
    Patch by Gianluca Righetto, reviewed by Ekaterina Dimitrova and Zhao Yang for  CASSANDRA-15526
---
 CHANGES.txt                                                      | 1 +
 .../org/apache/cassandra/index/sasi/memory/KeyRangeIterator.java | 4 ++--
 .../org/apache/cassandra/index/sasi/memory/SkipListMemIndex.java | 9 ++++++---
 .../org/apache/cassandra/index/sasi/memory/TrieMemIndex.java     | 5 +++--
 4 files changed, 12 insertions(+), 7 deletions(-)

diff --git a/CHANGES.txt b/CHANGES.txt
index 508ae19..8c8e74b 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 4.0-alpha4
+ * Fixed empty check in TrieMemIndex due to potential state inconsistency in ConcurrentSkipListMap (CASSANDRA-15526)
  * Add compaction allocation measurement test (CASSANDRA-15388)
  * Added UnleveledSSTables global and table level metric (CASSANDRA-15620)
  * Added Virtual Table exposing Cassandra relevant system properties (CASSANDRA-15616, CASSANDRA-15643)
diff --git a/src/java/org/apache/cassandra/index/sasi/memory/KeyRangeIterator.java b/src/java/org/apache/cassandra/index/sasi/memory/KeyRangeIterator.java
index 59d1122..0f681b7 100644
--- a/src/java/org/apache/cassandra/index/sasi/memory/KeyRangeIterator.java
+++ b/src/java/org/apache/cassandra/index/sasi/memory/KeyRangeIterator.java
@@ -37,9 +37,9 @@ public class KeyRangeIterator extends RangeIterator<Long, Token>
 {
     private final DKIterator iterator;
 
-    public KeyRangeIterator(ConcurrentSkipListSet<DecoratedKey> keys)
+    public KeyRangeIterator(ConcurrentSkipListSet<DecoratedKey> keys, int size)
     {
-        super((Long) keys.first().getToken().getTokenValue(), (Long) keys.last().getToken().getTokenValue(), keys.size());
+        super((Long) keys.first().getToken().getTokenValue(), (Long) keys.last().getToken().getTokenValue(), size);
         this.iterator = new DKIterator(keys.iterator());
     }
 
diff --git a/src/java/org/apache/cassandra/index/sasi/memory/SkipListMemIndex.java b/src/java/org/apache/cassandra/index/sasi/memory/SkipListMemIndex.java
index 69b57d0..9e44344 100644
--- a/src/java/org/apache/cassandra/index/sasi/memory/SkipListMemIndex.java
+++ b/src/java/org/apache/cassandra/index/sasi/memory/SkipListMemIndex.java
@@ -88,9 +88,12 @@ public class SkipListMemIndex extends MemIndex
         }
 
         RangeUnionIterator.Builder<Long, Token> builder = RangeUnionIterator.builder();
-        search.values().stream()
-                       .filter(keys -> !keys.isEmpty())
-                       .forEach(keys -> builder.add(new KeyRangeIterator(keys)));
+
+        for (ConcurrentSkipListSet<DecoratedKey> keys : search.values()) {
+            int size;
+            if ((size = keys.size()) > 0)
+                builder.add(new KeyRangeIterator(keys, size));
+        }
 
         return builder.build();
     }
diff --git a/src/java/org/apache/cassandra/index/sasi/memory/TrieMemIndex.java b/src/java/org/apache/cassandra/index/sasi/memory/TrieMemIndex.java
index 21cb7ce..cebd68f 100644
--- a/src/java/org/apache/cassandra/index/sasi/memory/TrieMemIndex.java
+++ b/src/java/org/apache/cassandra/index/sasi/memory/TrieMemIndex.java
@@ -146,8 +146,9 @@ public class TrieMemIndex extends MemIndex
             RangeUnionIterator.Builder<Long, Token> builder = RangeUnionIterator.builder();
             for (ConcurrentSkipListSet<DecoratedKey> keys : search)
             {
-                if (!keys.isEmpty())
-                    builder.add(new KeyRangeIterator(keys));
+                int size;
+                if ((size = keys.size()) > 0)
+                    builder.add(new KeyRangeIterator(keys, size));
             }
 
             return builder.build();


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cassandra.apache.org
For additional commands, e-mail: commits-help@cassandra.apache.org