[ 
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)

Reply via email to