Uploaded image for project: 'Cassandra'
  1. Cassandra
  2. CASSANDRA-14444

Got NPE when querying Cassandra 3.11.2

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Resolved
    • Urgent
    • Resolution: Duplicate
    • 3.11.5
    • Legacy/CQL
    • Ubuntu 14.04, JDK 1.8.0_171. 

      Cassandra 3.11.2

    • Critical

    Description

      We just upgraded our Cassandra cluster from 2.2.6 to 3.11.2

      After upgrading, we immediately got exceptions in Cassandra like this one: 

       

      ERROR [Native-Transport-Requests-1] 2018-05-11 17:10:21,994 QueryMessage.java:129 - Unexpected error during query
      java.lang.NullPointerException: null
      at org.apache.cassandra.dht.RandomPartitioner.getToken(RandomPartitioner.java:248) ~[apache-cassandra-3.11.2.jar:3.11.2]
      at org.apache.cassandra.dht.RandomPartitioner.decorateKey(RandomPartitioner.java:92) ~[apache-cassandra-3.11.2.jar:3.11.2]
      at org.apache.cassandra.config.CFMetaData.decorateKey(CFMetaData.java:666) ~[apache-cassandra-3.11.2.jar:3.11.2]
      at org.apache.cassandra.service.pager.PartitionRangeQueryPager.<init>(PartitionRangeQueryPager.java:44) ~[apache-cassandra-3.11.2.jar:3.11.2]
      at org.apache.cassandra.db.PartitionRangeReadCommand.getPager(PartitionRangeReadCommand.java:268) ~[apache-cassandra-3.11.2.jar:3.11.2]
      at org.apache.cassandra.cql3.statements.SelectStatement.getPager(SelectStatement.java:475) ~[apache-cassandra-3.11.2.jar:3.11.2]
      at org.apache.cassandra.cql3.statements.SelectStatement.execute(SelectStatement.java:288) ~[apache-cassandra-3.11.2.jar:3.11.2]
      at org.apache.cassandra.cql3.statements.SelectStatement.execute(SelectStatement.java:118) ~[apache-cassandra-3.11.2.jar:3.11.2]
      at org.apache.cassandra.cql3.QueryProcessor.processStatement(QueryProcessor.java:224) ~[apache-cassandra-3.11.2.jar:3.11.2]
      at org.apache.cassandra.cql3.QueryProcessor.process(QueryProcessor.java:255) ~[apache-cassandra-3.11.2.jar:3.11.2]
      at org.apache.cassandra.cql3.QueryProcessor.process(QueryProcessor.java:240) ~[apache-cassandra-3.11.2.jar:3.11.2]
      at org.apache.cassandra.transport.messages.QueryMessage.execute(QueryMessage.java:116) ~[apache-cassandra-3.11.2.jar:3.11.2]
      at org.apache.cassandra.transport.Message$Dispatcher.channelRead0(Message.java:517) [apache-cassandra-3.11.2.jar:3.11.2]
      at org.apache.cassandra.transport.Message$Dispatcher.channelRead0(Message.java:410) [apache-cassandra-3.11.2.jar:3.11.2]
      at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:105) [netty-all-4.0.44.Final.jar:4.0.44.Final]
      at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:357) [netty-all-4.0.44.Final.jar:4.0.44.Final]
      at io.netty.channel.AbstractChannelHandlerContext.access$600(AbstractChannelHandlerContext.java:35) [netty-all-4.0.44.Final.jar:4.0.44.Final]
      at io.netty.channel.AbstractChannelHandlerContext$7.run(AbstractChannelHandlerContext.java:348) [netty-all-4.0.44.Final.jar:4.0.44.Final]
      at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_171]
      at org.apache.cassandra.concurrent.AbstractLocalAwareExecutorService$FutureTask.run(AbstractLocalAwareExecutorService.java:162) [apache-cassandra-3.11.2.jar:3.11.2]
      at org.apache.cassandra.concurrent.SEPWorker.run(SEPWorker.java:109) [apache-cassandra-3.11.2.jar:3.11.2]
      at java.lang.Thread.run(Thread.java:748) [na:1.8.0_171]
      

       

      The table schema is like:

      CREATE TABLE example.example_table (
       id bigint,
       hash text,
       json text,
       PRIMARY KEY (id, hash)
      ) WITH COMPACT STORAGE
      

       

      The query is something like:

      "select * from example.example_table;" // (We do know this is bad practise, and we are trying to fix that right now)
      

      with fetch-size as 200, using DataStax Java driver. 

      This table contains about 20k rows. 

       

      Actually, the fix is quite simple, 

       

      --- a/src/java/org/apache/cassandra/service/pager/PagingState.java
      +++ b/src/java/org/apache/cassandra/service/pager/PagingState.java
      @@ -46,7 +46,7 @@ public class PagingState
      
      public PagingState(ByteBuffer partitionKey, RowMark rowMark, int remaining, int remainingInPartition)
       {
      - this.partitionKey = partitionKey;
      + this.partitionKey = partitionKey == null ? ByteBufferUtil.EMPTY_BYTE_BUFFER : partitionKey;
       this.rowMark = rowMark;
       this.remaining = remaining;
       this.remainingInPartition = remainingInPartition;
      

       

      "partitionKey == null ? ByteBufferUtil.EMPTY_BYTE_BUFFER : partitionKey;" is in 2.2.6 and 2.2.8. But it was removed for some reason. 

      The interesting part is that, we have: 

      public final ByteBuffer partitionKey; // Can be null for single partition queries.
      

      It seems "partitionKey" could be null.

      Thanks a lot. 

       

       

       

      Attachments

        Issue Links

          Activity

            People

              xxd Xiaodong Xie
              xxd Xiaodong Xie
              Xiaodong Xie
              Votes:
              0 Vote for this issue
              Watchers:
              6 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved:

                Time Tracking

                  Estimated:
                  Original Estimate - Not Specified
                  Not Specified
                  Remaining:
                  Remaining Estimate - 0h
                  0h
                  Logged:
                  Time Spent - 10m
                  10m