[
https://issues.apache.org/jira/browse/CASSANDRA-9324?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14533028#comment-14533028
]
Tyler Hobbs commented on CASSANDRA-9324:
----------------------------------------
The problem has to do with a change to collection serialization in 2.1. In
2.0, collections used shorts for the number of collection elements and the
sizes of each element. In 2.1, shorts are still used when using the v1 or v2
native protocol, but ints are used instead when using the v3 native protocol.
You're not using the native protocol at all, but the problem is that for Thrift
requests we default to using the serialization format for the most recent
native protocol version (v3). (Thanks to [~snazy] for pointing this error out.)
I'm not really sure what the best way to fix this is. Locking Thrift requests
into using the v2 serialization format could break any existing Thrift users on
2.1. We could allow setting a serialization version on Thrift connections, but
the Thrift API was technically frozen starting with 2.1.
As a workaround, you will need to use ints for collection counts/sizes when
talking to a 2.1 node. However, my honest suggestion is to consider moving to
a proper CQL and native-protocol based driver if you plan to work with CQL
constructs like collections.
> Map Mutation rejected by Cassandra: IllegalArgumentException
> ------------------------------------------------------------
>
> Key: CASSANDRA-9324
> URL: https://issues.apache.org/jira/browse/CASSANDRA-9324
> Project: Cassandra
> Issue Type: Bug
> Components: API
> Environment: Windows 7, Cassandra 2.1.5
> Reporter: Mark Wick
> Assignee: Tyler Hobbs
> Priority: Minor
> Fix For: 2.1.x
>
>
> We use a collection (map<ascii,ascii>) in a CQL3 table. We write into that
> cql3 table using thrift mutations, from a c++ application. We are prototyping
> migrating from our current Cassandra (2.0.7) to 2.1.5, and are unable to
> write rows to this cql3 table. We have no problems when we remove the writes
> to the map column, and all other writes succeed in this case. Cassandra is
> rejecting our writes and we are catching a TTransportException (no more data
> to read). The below call stack is from the Cassandra instance that is
> rejecting the write.
> {code}
> ERROR 14:08:10 Error occurred during processing of message.
> java.lang.IllegalArgumentException: null
> at java.nio.Buffer.limit(Unknown Source) ~[na:1.7.0_71]
> at
> org.apache.cassandra.utils.ByteBufferUtil.readBytes(ByteBufferUtil.java:543)
> ~[apache-cassandra-2.1.5.jar:2.1.5]
> at
> org.apache.cassandra.serializers.CollectionSerializer.readValue(CollectionSerializer.java:124)
> ~[apache-cassandra-2.1.5.jar:2.1.5]
> at
> org.apache.cassandra.serializers.MapSerializer.validateForNativeProtocol(MapSerializer.java:80)
> ~[apache-cassandra-2.1.5.jar:2.1.5]
> at
> org.apache.cassandra.serializers.CollectionSerializer.validate(CollectionSerializer.java:61)
> ~[apache-cassandra-2.1.5.jar:2.1.5]
> at
> org.apache.cassandra.db.marshal.AbstractType.validate(AbstractType.java:97)
> ~[apache-cassandra-2.1.5.jar:2.1.5]
> at
> org.apache.cassandra.thrift.ThriftValidation.validateColumnData(ThriftValidation.java:449)
> ~[apache-cassandra-2.1.5.jar:2.1.5]
> at
> org.apache.cassandra.thrift.ThriftValidation.validateColumnOrSuperColumn(ThriftValidation.java:318)
> ~[apache-cassandra-2.1.5.jar:2.1.5]
> at
> org.apache.cassandra.thrift.ThriftValidation.validateMutation(ThriftValidation.java:385)
> ~[apache-cassandra-2.1.5.jar:2.1.5]
> at
> org.apache.cassandra.thrift.CassandraServer.createMutationList(CassandraServer.java:861)
> ~[apache-cassandra-2.1.5.jar:2.1.5]
> at
> org.apache.cassandra.thrift.CassandraServer.batch_mutate(CassandraServer.java:976)
> ~[apache-cassandra-2.1.5.jar:2.1.5]
> at
> org.apache.cassandra.thrift.Cassandra$Processor$batch_mutate.getResult(Cassandra.java:3996)
> ~[apache-cassandra-thrift-2.1.5.jar:2.1.5]
> at
> org.apache.cassandra.thrift.Cassandra$Processor$batch_mutate.getResult(Cassandra.java:3980)
> ~[apache-cassandra-thrift-2.1.5.jar:2.1.5]
> at org.apache.thrift.ProcessFunction.process(ProcessFunction.java:39)
> ~[libthrift-0.9.2.jar:0.9.2]
> at org.apache.thrift.TBaseProcessor.process(TBaseProcessor.java:39)
> ~[libthrift-0.9.2.jar:0.9.2]
> at
> org.apache.cassandra.thrift.CustomTThreadPoolServer$WorkerProcess.run(CustomTThreadPoolServer.java:205)
> ~[apache-cassandra-2.1.5.jar:2.1.5]
> at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
> [na:1.7.0_71]
> at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
> [na:1.7.0_71]
> at java.lang.Thread.run(Unknown Source) [na:1.7.0_71]{code}
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)