Hi all,
I am new to cassandra and I am trying to solve something I am stuck
with. It is quite easy conceptually but I am stuck with it so maybe
somebody with knowledge of the internals knows what I am doing wrong.
I want to slice the CFs of a secondary index. So you can try with
cfs.getRangeSlice(...) or access the cfs.getSequentialIterator(..). The
problem is no matter what ranges, combinations or methods I can think of
I always hit this exception:
ERROR 12:30:49,416 Exception in thread Thread[ReadStage:2,5,main]
java.lang.RuntimeException: java.lang.ClassCastException:
java.nio.HeapByteBuffer cannot be cast to java.lang.Long
at
org.apache.cassandra.service.StorageProxy$DroppableRunnable.run(StorageProxy.java:1880)
at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)
Caused by: java.lang.ClassCastException: java.nio.HeapByteBuffer cannot
be cast to java.lang.Long
at org.apache.cassandra.dht.LongToken.compareTo(LongToken.java:31)
at
org.apache.cassandra.dht.Token$KeyBound.compareTo(Token.java:197)
at org.apache.cassandra.dht.Token$KeyBound.compareTo(Token.java:1)
at
org.apache.cassandra.utils.IntervalTree.comparePoints(IntervalTree.java:191)
at
org.apache.cassandra.utils.IntervalTree.access$2(IntervalTree.java:181)
at
org.apache.cassandra.utils.IntervalTree$IntervalNode.searchInternal(IntervalTree.java:293)
at
org.apache.cassandra.utils.IntervalTree.search(IntervalTree.java:140)
at
org.apache.cassandra.db.ColumnFamilyStore$AbstractViewSSTableFinder.sstablesForRowBounds(ColumnFamilyStore.java:1457)
at
org.apache.cassandra.db.ColumnFamilyStore$7.findSSTables(ColumnFamilyStore.java:1511)
at
org.apache.cassandra.db.ColumnFamilyStore.markReferenced(ColumnFamilyStore.java:1476)
at
org.apache.cassandra.db.ColumnFamilyStore.markReferenced(ColumnFamilyStore.java:1507)
at
org.apache.cassandra.db.ColumnFamilyStore.getSequentialIterator(ColumnFamilyStore.java:1594)
at
org.apache.cassandra.db.index.keys.KeysSearcher$1.computeNext(KeysSearcher.java:125)
at
org.apache.cassandra.db.index.keys.KeysSearcher$1.computeNext(KeysSearcher.java:1)
at
com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143)
at
com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138)
at
org.apache.cassandra.db.ColumnFamilyStore.filter(ColumnFamilyStore.java:1754)
at
org.apache.cassandra.db.index.keys.KeysSearcher.search(KeysSearcher.java:56)
at
org.apache.cassandra.db.index.SecondaryIndexManager.search(SecondaryIndexManager.java:537)
at
org.apache.cassandra.db.ColumnFamilyStore.search(ColumnFamilyStore.java:1742)
at
org.apache.cassandra.db.RangeSliceCommand.executeLocally(RangeSliceCommand.java:135)
at
org.apache.cassandra.service.StorageProxy$LocalRangeSliceRunnable.runMayThrow(StorageProxy.java:1363)
at
org.apache.cassandra.service.StorageProxy$DroppableRunnable.run(StorageProxy.java:1876)
... 3 more
Here he is trying to compare a Long (range is a long) to a
LocalToken(comparator=LongType, token=HeapByteBuffer(=1968)) where my
query was 'select * from users where birth_date>=1968' and birth_date is
a Long.
So it looks almost right as the LocalToken has the LongComparator etc.
but it is failing obviously.
My suspicion is that here we are trying to look for the 1968 parition of
the index, and this 1968 happens to not be a Long which is what range is
providing.
Any clues on what might actually be happening??
Thanks a lot in advance.