[ https://issues.apache.org/jira/browse/CASSANDRA-9324?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14532957#comment-14532957 ]
Mark Wick commented on CASSANDRA-9324: -------------------------------------- Sure - here's the cql3 create table statement (I've removed the other non-key columns for brevity's sake): CREATE TABLE points ( name ascii, id varint, attributes map<ascii,ascii>, PRIMARY KEY(name, id) ) WITH CLUSTERING ORDER BY(id ASC); Here's a snippet of the c++ used to generate the mutation (with minor refactoring to removing product information): for(TSPoint::Attributes::const_iterator it = point->get_metadata_itr_begin(); it != point->get_metadata_itr_end(); it++) { CompositeColumnList name_parts; name_parts.push_back(&id_v); std::string attributes_s("attributes"); //CassValue is our own class which encodes various types to the bytes Cassandra expects //It is unchanged since our migration from 2.0.14 CassValue attributes_name_v(attributes_s); name_parts.push_back(&attributes_name_v); CassValue name_v(it->first); name_parts.push_back(&name_v); CassValue item(it->second); OSII_TIME_T current_time_ms = utc_time_ms(); Mutation m; m.column_or_supercolumn.column.name = encode_values(name_parts); m.column_or_supercolumn.column.value = item.stringValue(); m.column_or_supercolumn.column.timestamp = current_time_ms * 1000; m.__isset.column_or_supercolumn = true; m.column_or_supercolumn.__isset.column = true; m.column_or_supercolumn.column.__isset.value = true; m.column_or_supercolumn.column.__isset.timestamp = true; //...code ommited for storage / sending of the Mutation after it's been created } //here's the function to encode the composite column, which is used successfully for our other mutations with no errors, and which is unchanged from when this worked in 2.0.14 std::string CassandraConnection::encode_values(CompositeColumnList & values) { std::string result; result.reserve(values.size() * 10);//approximate, for efficiency only for(CompositeColumnList::iterator it = values.begin(); it != values.end(); it++) { //Encode value - size then data //encode_int16_to_string just stores the raw bytes in a std::string, as the thrift API expects for byte arrays/buffers result += encode_int16_to_string((OSII_UINT16)(*it)->size()); result += (*it)->stringValue(); result += '\0'; } return result; } > 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 > 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)