Tim Whittington created CASSANDRA-7898: ------------------------------------------
Summary: IndexOutOfBoundsException comparing incompatible reversed types in DynamicCompositeType Key: CASSANDRA-7898 URL: https://issues.apache.org/jira/browse/CASSANDRA-7898 Project: Cassandra Issue Type: Bug Components: Core Reporter: Tim Whittington In the following setup, an IndexOutOfBoundsException is often observed: * A DynamicCompositeType value is used in a column name (e.g. in a CQL3 cluster key) * Two incompatible types (e.g. Int32Type and DoubleType) are used in the dynamic composite value in their reversed form (e.g. ReversedType(Int32Type) and ReversedType(DoubleType) * Values for the incompatible types are inserted * One of various scenarios occurs that trigger comparison of the column names The exception can be variously observed (sometimes not immediately) during query execution, memtable flushing, commit log replay etc. In some cases this can prevent Cassandra server startup (e.g. during commit log replay). Typical stack traces follow: {noformat} java.lang.RuntimeException: java.lang.IndexOutOfBoundsException at org.apache.cassandra.service.StorageProxy$LocalMutationRunnable.run(StorageProxy.java:1968) 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:745) Caused by: java.lang.IndexOutOfBoundsException at java.nio.Buffer.checkIndex(Buffer.java:538) at java.nio.HeapByteBuffer.getDouble(HeapByteBuffer.java:512) at org.apache.cassandra.utils.ByteBufferUtil.toDouble(ByteBufferUtil.java:431) at org.apache.cassandra.serializers.DoubleSerializer.deserialize(DoubleSerializer.java:33) at org.apache.cassandra.serializers.DoubleSerializer.deserialize(DoubleSerializer.java:25) at org.apache.cassandra.db.marshal.AbstractType.compose(AbstractType.java:142) at org.apache.cassandra.db.marshal.DoubleType.compare(DoubleType.java:45) at org.apache.cassandra.db.marshal.DoubleType.compare(DoubleType.java:28) at org.apache.cassandra.db.marshal.ReversedType.compare(ReversedType.java:73) at org.apache.cassandra.db.marshal.ReversedType.compare(ReversedType.java:30) at org.apache.cassandra.db.marshal.AbstractType.compareCollectionMembers(AbstractType.java:279) at org.apache.cassandra.db.marshal.AbstractCompositeType.compare(AbstractCompositeType.java:64) at org.apache.cassandra.db.marshal.AbstractCompositeType.compare(AbstractCompositeType.java:36) at org.apache.cassandra.db.marshal.AbstractType.compareCollectionMembers(AbstractType.java:279) at org.apache.cassandra.db.marshal.AbstractCompositeType.compare(AbstractCompositeType.java:64) at org.apache.cassandra.db.marshal.AbstractCompositeType.compare(AbstractCompositeType.java:36) at edu.stanford.ppl.concurrent.SnapTreeMap$1.compareTo(SnapTreeMap.java:538) at edu.stanford.ppl.concurrent.SnapTreeMap.attemptUpdate(SnapTreeMap.java:1108) at edu.stanford.ppl.concurrent.SnapTreeMap.attemptUpdate(SnapTreeMap.java:1192) at edu.stanford.ppl.concurrent.SnapTreeMap.attemptUpdate(SnapTreeMap.java:1192) at edu.stanford.ppl.concurrent.SnapTreeMap.attemptUpdate(SnapTreeMap.java:1192) at edu.stanford.ppl.concurrent.SnapTreeMap.updateUnderRoot(SnapTreeMap.java:1059) at edu.stanford.ppl.concurrent.SnapTreeMap.update(SnapTreeMap.java:1023) at edu.stanford.ppl.concurrent.SnapTreeMap.putIfAbsent(SnapTreeMap.java:985) at org.apache.cassandra.db.AtomicSortedColumns$Holder.addColumn(AtomicSortedColumns.java:319) at org.apache.cassandra.db.AtomicSortedColumns.addAllWithSizeDelta(AtomicSortedColumns.java:191) at org.apache.cassandra.db.Memtable.resolve(Memtable.java:226) at org.apache.cassandra.db.Memtable.put(Memtable.java:173) at org.apache.cassandra.db.ColumnFamilyStore.apply(ColumnFamilyStore.java:900) at org.apache.cassandra.db.Keyspace.apply(Keyspace.java:374) at org.apache.cassandra.db.Keyspace.apply(Keyspace.java:339) at org.apache.cassandra.db.RowMutation.apply(RowMutation.java:211) at org.apache.cassandra.service.StorageProxy$7.runMayThrow(StorageProxy.java:952) at org.apache.cassandra.service.StorageProxy$LocalMutationRunnable.run(StorageProxy.java:1964) {noformat} {noformat} java.lang.IndexOutOfBoundsException at java.nio.Buffer.checkIndex(Buffer.java:538) at java.nio.HeapByteBuffer.getDouble(HeapByteBuffer.java:512) at org.apache.cassandra.utils.ByteBufferUtil.toDouble(ByteBufferUtil.java:431) at org.apache.cassandra.serializers.DoubleSerializer.deserialize(DoubleSerializer.java:33) at org.apache.cassandra.serializers.DoubleSerializer.deserialize(DoubleSerializer.java:25) at org.apache.cassandra.db.marshal.AbstractType.compose(AbstractType.java:142) at org.apache.cassandra.db.marshal.DoubleType.compare(DoubleType.java:45) at org.apache.cassandra.db.marshal.DoubleType.compare(DoubleType.java:28) at org.apache.cassandra.db.marshal.ReversedType.compare(ReversedType.java:73) at org.apache.cassandra.db.marshal.ReversedType.compare(ReversedType.java:30) at org.apache.cassandra.db.marshal.AbstractType.compareCollectionMembers(AbstractType.java:279) at org.apache.cassandra.db.marshal.AbstractCompositeType.compare(AbstractCompositeType.java:64) at org.apache.cassandra.db.marshal.AbstractCompositeType.compare(AbstractCompositeType.java:36) at org.apache.cassandra.io.sstable.ColumnNameHelper.max(ColumnNameHelper.java:159) at org.apache.cassandra.io.sstable.ColumnNameHelper.mergeMax(ColumnNameHelper.java:245) at org.apache.cassandra.io.sstable.SSTableMetadata$Collector.updateMaxColumnNames(SSTableMetadata.java:346) at org.apache.cassandra.io.sstable.SSTableMetadata$Collector.update(SSTableMetadata.java:327) at org.apache.cassandra.io.sstable.SSTableWriter.append(SSTableWriter.java:194) at org.apache.cassandra.db.Memtable$FlushRunnable.writeSortedContents(Memtable.java:397) at org.apache.cassandra.db.Memtable$FlushRunnable.runWith(Memtable.java:350) at org.apache.cassandra.io.util.DiskAwareRunnable.runMayThrow(DiskAwareRunnable.java:48) at org.apache.cassandra.utils.WrappedRunnable.run(WrappedRunnable.java:28) 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:745) {noformat} {noformat} java.lang.RuntimeException: java.lang.IndexOutOfBoundsException at org.apache.cassandra.service.StorageProxy$DroppableRunnable.run(StorageProxy.java:1931) 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:745) Caused by: java.lang.IndexOutOfBoundsException at java.nio.Buffer.checkIndex(Buffer.java:538) at java.nio.HeapByteBuffer.getDouble(HeapByteBuffer.java:512) at org.apache.cassandra.utils.ByteBufferUtil.toDouble(ByteBufferUtil.java:431) at org.apache.cassandra.serializers.DoubleSerializer.deserialize(DoubleSerializer.java:33) at org.apache.cassandra.serializers.DoubleSerializer.deserialize(DoubleSerializer.java:25) at org.apache.cassandra.db.marshal.AbstractType.compose(AbstractType.java:142) at org.apache.cassandra.db.marshal.DoubleType.compare(DoubleType.java:45) at org.apache.cassandra.db.marshal.DoubleType.compare(DoubleType.java:28) at org.apache.cassandra.db.marshal.ReversedType.compare(ReversedType.java:73) at org.apache.cassandra.db.marshal.ReversedType.compare(ReversedType.java:30) at org.apache.cassandra.db.marshal.AbstractType.compareCollectionMembers(AbstractType.java:279) at org.apache.cassandra.db.marshal.AbstractCompositeType.compare(AbstractCompositeType.java:64) at org.apache.cassandra.db.marshal.AbstractCompositeType.compare(AbstractCompositeType.java:36) at org.apache.cassandra.db.marshal.CompositeType.compare(CompositeType.java:310) at org.apache.cassandra.db.marshal.CompositeType.intersects(CompositeType.java:275) at org.apache.cassandra.db.filter.SliceQueryFilter.shouldInclude(SliceQueryFilter.java:342) at org.apache.cassandra.db.filter.QueryFilter.shouldInclude(QueryFilter.java:234) at org.apache.cassandra.db.CollationController.collectAllData(CollationController.java:236) at org.apache.cassandra.db.CollationController.getTopLevelColumns(CollationController.java:53) at org.apache.cassandra.db.ColumnFamilyStore.getTopLevelColumns(ColumnFamilyStore.java:1547) at org.apache.cassandra.db.ColumnFamilyStore.getColumnFamily(ColumnFamilyStore.java:1376) at org.apache.cassandra.db.Keyspace.getRow(Keyspace.java:333) at org.apache.cassandra.db.SliceFromReadCommand.getRow(SliceFromReadCommand.java:65) at org.apache.cassandra.service.StorageProxy$LocalReadRunnable.runMayThrow(StorageProxy.java:1363) at org.apache.cassandra.service.StorageProxy$DroppableRunnable.run(StorageProxy.java:1927) {noformat} -- This message was sent by Atlassian JIRA (v6.3.4#6332)