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

Reply via email to