[ 
https://issues.apache.org/jira/browse/CASSANDRA-20022?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Niket Vilas Bagwe updated CASSANDRA-20022:
------------------------------------------
    Fix Version/s: 4.0.x
                   4.1.x

> ChannelProxy read might not read complete buffer causing "Checksum didn't 
> match" error for sstableloader
> --------------------------------------------------------------------------------------------------------
>
>                 Key: CASSANDRA-20022
>                 URL: https://issues.apache.org/jira/browse/CASSANDRA-20022
>             Project: Cassandra
>          Issue Type: Bug
>          Components: Tool/bulk load
>            Reporter: Niket Vilas Bagwe
>            Priority: Normal
>             Fix For: 4.0.x, 4.1.x
>
>
> CassandraCompressedStreamWriter expects the outbuffer to be filled completely 
> while issuing the read call for ChannelProxy. Please refer the code snippet 
> below from CassandraCompressedStreamWriter.
> {code:java}
>   out.writeToChannel(bufferSupplier -> {
>       ByteBuffer outBuffer = bufferSupplier.get(toTransfer);
>       long read = fc.read(outBuffer, position);
>       assert read == toTransfer : String.format("could not read required 
> number of bytes from file to be streamed: read %d bytes, wanted %d bytes", 
> read, toTransfer);
>       outBuffer.flip();
>   }, limiter);  {code}
> This is problematic since the underlying FileChannel implementation for 
> ChannelProxy can have reads less than the buffer size causing the file upload 
> operation to fail. 
> Also, to catch the above problem an assertion is used instead of using an 
> Exception. Assertions have to enabled explicitly by passing -ea flag to the 
> java runtime. 
> If assertions are disabled, the above partial read operation can cause an 
> invalid buffer to get transferred to the cassandra peer causing "Checksum 
> didn't match" error on the peer as shown below.
> {code:java}
> org.apache.cassandra.streaming.StreamReceiveException: java.io.IOException: 
> Checksum didn't match (expected: 1967481976, actual: 2124622197)
>         at 
> org.apache.cassandra.streaming.messages.IncomingStreamMessage$1.deserialize(IncomingStreamMessage.java:60)
>         at 
> org.apache.cassandra.streaming.messages.IncomingStreamMessage$1.deserialize(IncomingStreamMessage.java:38)
>         at 
> org.apache.cassandra.streaming.messages.StreamMessage.deserialize(StreamMessage.java:53)
>         at 
> org.apache.cassandra.streaming.async.StreamingInboundHandler$StreamDeserializingTask.run(StreamingInboundHandler.java:172)
>         at 
> io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
>         at java.base/java.lang.Thread.run(Thread.java:834)
> Caused by: java.io.IOException: Checksum didn't match (expected: 1967481976, 
> actual: 2124622197)
>         at 
> org.apache.cassandra.db.streaming.CompressedInputStream.maybeValidateChecksum(CompressedInputStream.java:206)
>         at 
> org.apache.cassandra.db.streaming.CompressedInputStream.loadNextChunk(CompressedInputStream.java:157)
>         at 
> org.apache.cassandra.db.streaming.CompressedInputStream.reBuffer(CompressedInputStream.java:121)
>         at 
> org.apache.cassandra.io.util.RebufferingInputStream.read(RebufferingInputStream.java:90)
>         at 
> org.apache.cassandra.io.util.RebufferingInputStream.readFully(RebufferingInputStream.java:68)
>         at 
> org.apache.cassandra.io.util.RebufferingInputStream.readFully(RebufferingInputStream.java:62)
>         at 
> org.apache.cassandra.io.util.TrackedDataInputPlus.readFully(TrackedDataInputPlus.java:93)
>         at 
> org.apache.cassandra.db.marshal.ByteArrayAccessor.read(ByteArrayAccessor.java:101)
>         at 
> org.apache.cassandra.db.marshal.ByteArrayAccessor.read(ByteArrayAccessor.java:38)
>         at 
> org.apache.cassandra.db.marshal.AbstractType.read(AbstractType.java:500)
>         at 
> org.apache.cassandra.db.marshal.AbstractType.readArray(AbstractType.java:480)
>         at 
> org.apache.cassandra.db.ClusteringPrefix$Serializer.deserializeValuesWithoutSize(ClusteringPrefix.java:441)
>         at 
> org.apache.cassandra.db.Clustering$Serializer.deserialize(Clustering.java:164)
>         at 
> org.apache.cassandra.db.rows.UnfilteredSerializer.deserializeOne(UnfilteredSerializer.java:477)
>         at 
> org.apache.cassandra.db.rows.UnfilteredSerializer.deserialize(UnfilteredSerializer.java:434)
>         at 
> org.apache.cassandra.io.sstable.SSTableSimpleIterator$CurrentFormatIterator.computeNext(SSTableSimpleIterator.java:84)
>         at 
> org.apache.cassandra.io.sstable.SSTableSimpleIterator$CurrentFormatIterator.computeNext(SSTableSimpleIterator.java:62)
>         at 
> org.apache.cassandra.utils.AbstractIterator.hasNext(AbstractIterator.java:47)
>         at 
> org.apache.cassandra.db.streaming.CassandraStreamReader$StreamDeserializer.hasNext(CassandraStreamReader.java:249)
>         at 
> org.apache.cassandra.db.rows.UnfilteredRowIterator.isEmpty(UnfilteredRowIterator.java:67)
>         at 
> org.apache.cassandra.io.sstable.format.big.BigTableWriter.append(BigTableWriter.java:205)
>         at 
> org.apache.cassandra.io.sstable.SimpleSSTableMultiWriter.append(SimpleSSTableMultiWriter.java:48)
>         at 
> org.apache.cassandra.io.sstable.format.RangeAwareSSTableWriter.append(RangeAwareSSTableWriter.java:107)
>         at 
> org.apache.cassandra.db.streaming.CassandraStreamReader.writePartition(CassandraStreamReader.java:175)
>         at 
> org.apache.cassandra.db.streaming.CassandraCompressedStreamReader.read(CassandraCompressedStreamReader.java:98)
>         at 
> org.apache.cassandra.db.streaming.CassandraIncomingFile.read(CassandraIncomingFile.java:84)
>         at 
> org.apache.cassandra.streaming.messages.IncomingStreamMessage$1.deserialize(IncomingStreamMessage.java:53)
>         ... 5 common frames omitted {code}
>  



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to