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