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]
