Sylvain Lebresne created CASSANDRA-10352:
--------------------------------------------
Summary: Paging with DISTINCT and IN can throw ClassCastException
Key: CASSANDRA-10352
URL: https://issues.apache.org/jira/browse/CASSANDRA-10352
Project: Cassandra
Issue Type: Bug
Reporter: Sylvain Lebresne
Assignee: Sylvain Lebresne
Fix For: 2.1.x
The ctor of {{SliceQueryPager}} has the following code:
{noformat}
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);
restoreState(state.remaining, true);
}
{noformat}
The assumption that we can only get a {{CellName}} is invalid however. When
using a {{MultiPartitionPager}} (so when the query has a {{IN}} on the
partition key), it's possible for a page to stop at the end of one of the
underlying pager, and for that pager to be exhausted. If that's the case, the
{{PagingState}} returned will have the partition key of the next key to
retrieve, but a {{null}} cellname (since we haven't started to query that next
key). When the next page is queried, that {{PagingState}} will trigger a
{{ClassCastException}}.
The [following
dtest|https://github.com/pcmanus/cassandra-dtest/commit/b98a112fc22f92aa965d2068345c708ae43b8a85]
reproduces this problem.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)