[ 
https://issues.apache.org/jira/browse/CASSANDRA-8090?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14175089#comment-14175089
 ] 

Sylvain Lebresne commented on CASSANDRA-8090:
---------------------------------------------

bq. I try both approach but finally settled for the second one as it was making 
the code easier to understand.

Could you try to explain why the first one was less easy to understand? A 
priori I'm not a huge fan of copying selectors every time (and of all those 
factories) and I think I would have naturally gone towards some per-query state 
that would be passed to selectors.

> NullPointerException when using prepared statements
> ---------------------------------------------------
>
>                 Key: CASSANDRA-8090
>                 URL: https://issues.apache.org/jira/browse/CASSANDRA-8090
>             Project: Cassandra
>          Issue Type: Bug
>            Reporter: Carl Yeksigian
>            Assignee: Benjamin Lerer
>             Fix For: 3.0
>
>
> Due to the changes in CASSANDRA-4914, using a prepared statement from 
> multiple threads leads to a race condition where the simple selection may be 
> reset from a different thread, causing the following NPE:
> {noformat}
> java.lang.NullPointerException: null
>       at org.apache.cassandra.cql3.ResultSet.addRow(ResultSet.java:63) 
> ~[main/:na]
>       at 
> org.apache.cassandra.cql3.statements.Selection$ResultSetBuilder.build(Selection.java:372)
>  ~[main/:na]
>       at 
> org.apache.cassandra.cql3.statements.SelectStatement.process(SelectStatement.java:1120)
>  ~[main/:na]
>       at 
> org.apache.cassandra.cql3.statements.SelectStatement.processResults(SelectStatement.java:283)
>  ~[main/:na]
>       at 
> org.apache.cassandra.cql3.statements.SelectStatement.execute(SelectStatement.java:260)
>  ~[main/:na]
>       at 
> org.apache.cassandra.cql3.statements.SelectStatement.execute(SelectStatement.java:213)
>  ~[main/:na]
>       at 
> org.apache.cassandra.cql3.statements.SelectStatement.execute(SelectStatement.java:63)
>  ~[main/:na]
>       at 
> org.apache.cassandra.cql3.QueryProcessor.processStatement(QueryProcessor.java:226)
>  ~[main/:na]
>       at 
> org.apache.cassandra.cql3.QueryProcessor.processPrepared(QueryProcessor.java:481)
>  ~[main/:na]
>       at 
> org.apache.cassandra.transport.messages.ExecuteMessage.execute(ExecuteMessage.java:133)
>  ~[main/:na]
>       at 
> org.apache.cassandra.transport.Message$Dispatcher.channelRead0(Message.java:438)
>  [main/:na]
>       at 
> org.apache.cassandra.transport.Message$Dispatcher.channelRead0(Message.java:334)
>  [main/:na]
>       at 
> io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:105)
>  [netty-all-4.0.23.Final.jar:4.0.23.Final]
>       at 
> io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:333)
>  [netty-all-4.0.23.Final.jar:4.0.23.Final]
>       at 
> io.netty.channel.AbstractChannelHandlerContext.access$700(AbstractChannelHandlerContext.java:32)
>  [netty-all-4.0.23.Final.jar:4.0.23.Final]
>       at 
> io.netty.channel.AbstractChannelHandlerContext$8.run(AbstractChannelHandlerContext.java:324)
>  [netty-all-4.0.23.Final.jar:4.0.23.Final]
>       at 
> java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) 
> [na:1.7.0_67]
>       at 
> org.apache.cassandra.concurrent.AbstractTracingAwareExecutorService$FutureTask.run(AbstractTracingAwareExecutorService.java:163)
>  [main/:na]
>       at org.apache.cassandra.concurrent.SEPWorker.run(SEPWorker.java:103) 
> [main/:na]
>       at java.lang.Thread.run(Thread.java:745) [na:1.7.0_67]
> {noformat}
> Reproduced this using the stress tool:
> {noformat}
>  ./tools/bin/cassandra-stress user profile=tools/cqlstress-example.yaml 
> ops\(insert=1,simple1=1\)
> {noformat}
> You'll need to change the {noformat}select:{noformat} line to be /1000 to 
> prevent the illegal query exceptions.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to