Update current index block pointer when slice precedes partition start

When reverse iterating an indexed sstable partition, if the end bound of
the query slice is < the first unfiltered in the partition, the current
index block pointer is not updated. This causes the reader to incorrectly
jump to the end of the partition and start reading from there once the
initial emtpy iterator has been consumed.

Patch by Sam Tunnicliffe; reviewed by Aleksey Yeschenko and Blake Eggleston
for CASSANDRA-14513


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

Branch: refs/heads/cassandra-3.11
Commit: eb91942f64972bef04c4e965dcdf788ae1f21a60
Parents: 897b55a
Author: Sam Tunnicliffe <[email protected]>
Authored: Fri Jun 8 12:57:54 2018 +0100
Committer: Sam Tunnicliffe <[email protected]>
Committed: Thu Jun 14 18:15:57 2018 +0100

----------------------------------------------------------------------
 CHANGES.txt                                                        | 1 +
 .../cassandra/db/columniterator/AbstractSSTableIterator.java       | 2 +-
 .../cassandra/db/columniterator/SSTableReversedIterator.java       | 1 +
 3 files changed, 3 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/eb91942f/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 94fbcd2..ebf8764 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 3.0.17
+ * Reverse order queries with range tombstones can cause data loss 
(CASSANDRA-14513)
  * Fix regression of lagging commitlog flush log message (CASSANDRA-14451)
  * Add Missing dependencies in pom-all (CASSANDRA-14422)
  * Cleanup StartupClusterConnectivityChecker and PING Verb (CASSANDRA-14447)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/eb91942f/src/java/org/apache/cassandra/db/columniterator/AbstractSSTableIterator.java
----------------------------------------------------------------------
diff --git 
a/src/java/org/apache/cassandra/db/columniterator/AbstractSSTableIterator.java 
b/src/java/org/apache/cassandra/db/columniterator/AbstractSSTableIterator.java
index f9e6545..386b2c8 100644
--- 
a/src/java/org/apache/cassandra/db/columniterator/AbstractSSTableIterator.java
+++ 
b/src/java/org/apache/cassandra/db/columniterator/AbstractSSTableIterator.java
@@ -420,12 +420,12 @@ abstract class AbstractSSTableIterator implements 
SliceableUnfilteredRowIterator
             if (blockIdx >= 0 && blockIdx < indexes.size())
             {
                 reader.seekToPosition(columnOffset(blockIdx));
+                mark = reader.file.mark();
                 reader.deserializer.clearState();
             }
 
             currentIndexIdx = blockIdx;
             reader.openMarker = blockIdx > 0 ? indexes.get(blockIdx - 
1).endOpenMarker : null;
-            mark = reader.file.mark();
 
             // If we're reading an old format file and we move to the first 
block in the index (i.e. the
             // head of the partition), we skip the static row as it's already 
been read when we first opened

http://git-wip-us.apache.org/repos/asf/cassandra/blob/eb91942f/src/java/org/apache/cassandra/db/columniterator/SSTableReversedIterator.java
----------------------------------------------------------------------
diff --git 
a/src/java/org/apache/cassandra/db/columniterator/SSTableReversedIterator.java 
b/src/java/org/apache/cassandra/db/columniterator/SSTableReversedIterator.java
index 76d8c4d..d5b46a4 100644
--- 
a/src/java/org/apache/cassandra/db/columniterator/SSTableReversedIterator.java
+++ 
b/src/java/org/apache/cassandra/db/columniterator/SSTableReversedIterator.java
@@ -281,6 +281,7 @@ public class SSTableReversedIterator extends 
AbstractSSTableIterator
             if (startIdx < 0)
             {
                 iterator = Collections.emptyIterator();
+                indexState.setToBlock(startIdx);
                 return;
             }
 


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to