[
https://issues.apache.org/jira/browse/CASSANDRA-8090?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14172218#comment-14172218
]
Benjamin Lerer commented on CASSANDRA-8090:
-------------------------------------------
The patch is on
[branch|https://github.com/blerer/cassandra/compare/CASSANDRA-8090].
The problem came from the fact that when fixing CASSANDRA-4914 I introduced
some state within the selectors (not realising that the selector are called by
multiple threads) for the needs of aggregations.
To solve that problem I had to introduce unshared state. This could be done by
either having some unshared selector states outside of the selectors or by
instanciating a new set of selectors for each request.
I try both approach but finally settled for the second one as it was making the
code easier to understand.
To do that the patch introduce some new classes extending Selector.Factory.
Those classes are generated when the statement is prepared and they are then
used to generate the Selector instances at execution time.
As the Selection class was becoming to big and difficult to understand I
extracted the Selector classes into separate files.
> 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)