diff --git a/CHANGES.txt b/CHANGES.txt index 97858c514b..a83fd53242 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -9,6 +9,7 @@ * Fall back to 1/4 commitlog volume for commitlog_total_space on small disks (CASSANDRA-10199) Merged from 2.1: + * Fix potential ClassCastException during paging (CASSANDRA-10352) * Prevent ALTER TYPE from creating circular references (CASSANDRA-10339) * Fix cache handling of 2i and base tables (CASSANDRA-10155, 10359) * Fix NPE in nodetool compactionhistory (CASSANDRA-9758) diff --git a/src/java/org/apache/cassandra/service/pager/SliceQueryPager.java b/src/java/org/apache/cassandra/service/pager/SliceQueryPager.java index 520fc34699..c8572d4749 100644 --- a/src/java/org/apache/cassandra/service/pager/SliceQueryPager.java +++ b/src/java/org/apache/cassandra/service/pager/SliceQueryPager.java @@ -59,9 +59,10 @@ public class SliceQueryPager extends AbstractQueryPager implements SinglePartiti if (state != null) { - // The only case where this could be a non-CellName Composite is if it's Composites.EMPTY, but that's not - // valid for PagingState.cellName, so we can safely cast to CellName. - lastReturned = (CellName) cfm.comparator.fromByteBuffer(state.cellName); + // The cellname can be empty if this is used in a MultiPartitionPager and we're supposed to start reading this row + // (because the previous page has exhausted the previous pager). See #10352 for details. + if (state.cellName.hasRemaining()) + lastReturned = (CellName) cfm.comparator.fromByteBuffer(state.cellName); restoreState(state.remaining, true); } }