I have continued testing with Scylla but now I run into an issue that is blocker for me.
The issue is best described as a problem setting some fields as "null" values in UPDATE or INSERT statement via Java Driver.
I'm not really sure if this is know problem or not but I was not able to find this exact problem anywhere else.
For Java Driver I tried 2.0.0 and 2.1.7. My JDK is Oracle 1.7.something.
Here created keyspace and columnfamily and tested the partial null UPDATE from cqlsh:
As can be seen this obviously worked.
15/10/07 12:23:15 INFO core.NettyUtil: Found Netty's native epoll transport in the classpath, using it
15/10/07 12:23:15 INFO policies.DCAwareRoundRobinPolicy: Using data-center name 'datacenter1' for DCAwareRoundRobinPolicy (if this is incorrect, please provide the correct datacenter name with DCAwareRoundRobinPolicy constructor)
using test
java1 done
java2 done
java3 done
Exception in thread "main" com.datastax.driver.core.exceptions.InvalidQueryException: marshaling error: Conversion failed
at com.datastax.driver.core.exceptions.InvalidQueryException.copy(InvalidQueryException.java:35)
at com.datastax.driver.core.DefaultResultSetFuture.extractCauseFromExecutionException(DefaultResultSetFuture.java:269)
at com.datastax.driver.core.DefaultResultSetFuture.getUninterruptibly(DefaultResultSetFuture.java:183)
at com.datastax.driver.core.AbstractSession.execute(AbstractSession.java:52)
at com.documill.discovery.archive.implementation.cql.ScyllaTester.main(ScyllaTester.java:28)
Caused by: com.datastax.driver.core.exceptions.InvalidQueryException: marshaling error: Conversion failed
at com.datastax.driver.core.Responses$Error.asException(Responses.java:102)
at com.datastax.driver.core.DefaultResultSetFuture.onSet(DefaultResultSetFuture.java:118)
at com.datastax.driver.core.RequestHandler.setFinalResult(RequestHandler.java:183)
at com.datastax.driver.core.RequestHandler.access$2300(RequestHandler.java:45)
at com.datastax.driver.core.RequestHandler$SpeculativeExecution.setFinalResult(RequestHandler.java:748)
at com.datastax.driver.core.RequestHandler$SpeculativeExecution.onSet(RequestHandler.java:573)
at com.datastax.driver.core.Connection$Dispatcher.channelRead0(Connection.java:991)
at com.datastax.driver.core.Connection$Dispatcher.channelRead0(Connection.java:913)
at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:105)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:308)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:294)
at io.netty.handler.timeout.IdleStateHandler.channelRead(IdleStateHandler.java:266)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:308)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:294)
at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:308)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:294)
at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:265)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:308)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:294)
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:846)
at io.netty.channel.epoll.AbstractEpollStreamChannel$EpollStreamUnsafe.epollInReady(AbstractEpollStreamChannel.java:805)
at io.netty.channel.epoll.EpollEventLoop.processReady(EpollEventLoop.java:346)
at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:254)
at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:112)
at java.lang.Thread.run(Thread.java:745)
So it seems that the 4th statement was the problem where I tried to set val1 to "ddd" and val2 to null. That is obviously not the most elegant case but in my application I happen to have some wide column families which I update from long Object arrays which may contain some null fields. So creating new statement for 40 - cell wide column family every single time I have null somewhere in the array is not an option.
Also this behavior cannot be replicated on standard Cassandra, this is the output when connecting to Cassandra 2.1.9. (I also tried with 2.0.X)
I played around and was able to replicate this behavior in pretty many ways but usually it consisted of some non text value set to null. Also using UPDATE or INSERT did not seem to matter.
To me this does not seem to be correct behavior. Hope someone can clarify if I made some bad assumption or did not read something carefully enough.