The question related to C* driver and C* server itself. I'll ask it here and at C* driver developers group too. Hope somebody can give me an answer or maybe give an explanation why it happens as it happens.
This is the story about cassandra 2.2.7(I've checked it with the C* 3.* and result is the same) and driver 3.0.2. I am playing with blob in this table: CREATE TABLE compression_test ( id uuid, chunk int, data blob, PRIMARY KEY (id, chunk)) WITH compression = { 'sstable_compression' : '' }" Java cassandra driver has a compression option out of the box. It can compress data before send it to socket. I am thinking that driver compress source byte array, send it to C* and after processing it will be stored as is to SSTable. That is why the table configured without compression on SSTable level. But it's only my proposal. During investigation I found out that I was wrong. In my case I choose LZ4 compression in driver and 0.5G data was compressed down to 40Mb. Before send data to socket driver compress it, set COMPRESSED flag at the beginning of the compressed array and sent to C* server. Through debug I see that exactly 40Mb was written to socket. Meanwhile C* server has Server.Initial class that initialize netty ChannelPipelineand append severalChannelHandler's to it. One of the ChannelHandleris Frame.Decompressor. It check that given frame has a COMPRESSED flag and decompress data in case it exist. Also debugging I see that C* received exactly 40Mb chunk, find COMPRESSED flag, decompress it and process it. It leads to extra memory and disk consumption. I'm not sure how it's stored in mem table but absolutely sure that 0.5G of decompressed data is stored on disk driver. And it's not what I want. I can set LZ4 compressor for SSTable and the received chunk will be stored compressed but it's also not what I want. For what purpose C* decompress already compressed data? I am miss something in C* or driver configuration?