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

Xavier Fernandis commented on PHOENIX-8010:
-------------------------------------------

h3. *Stack trace*

xfernand@WM-H5XX6Y07V6 59954-phoenix % python3 ./bin/sqlline.py
2026-09-29T13:14:43,118 WARN  [main] impl.MetricsConfig: Cannot locate 
configuration: tried 
hadoop-metrics2-phoenix.properties,hadoop-metrics2.properties
2026-09-29T13:14:43,174 WARN  [main] util.NativeCodeLoader: Unable to load 
native-hadoop library for your platform... using builtin-java classes where 
applicable
2026-09-29T13:14:43,235 WARN  [main] impl.MetricsSystemImpl: Phoenix metrics 
system already initialized!
2026-09-29T13:14:43,349 WARN  [main] client.ZKConnectionRegistry: 
ZKConnectionRegistry is deprecated. See 
https://hbase.apache.org/book.html#client.rpcconnectionregistry
sqlline version 1.9.0
0: jdbc:phoenix:> CREATE TABLE users (id INTEGER NOT NULL PRIMARY KEY, name 
VARCHAR);
. . . . . . . . >   UPSERT INTO users VALUES (5, 'e');
. . . . . . . . >   SELECT * FROM users WHERE id = 5 LIMIT 5 OFFSET 0;
No rows affected (0.678 seconds)
1 row affected (0.02 seconds)
org.apache.hadoop.hbase.DoNotRetryIOException: 
org.apache.hadoop.hbase.DoNotRetryIOException: 
USERS,,1790668034952.69aee508a9784b9651f42254e187be11.: Cannot read the array 
length because "first" is null
        at 
org.apache.phoenix.util.ClientUtil.createIOException(ClientUtil.java:180)
        at 
org.apache.phoenix.util.ClientUtil.throwIOException(ClientUtil.java:188)
        at 
org.apache.phoenix.coprocessor.BaseScannerRegionObserver$RegionScannerHolder.overrideDelegate(BaseScannerRegionObserver.java:237)
        at 
org.apache.phoenix.coprocessor.BaseScannerRegionObserver$RegionScannerHolder.nextRaw(BaseScannerRegionObserver.java:265)
        at 
org.apache.hadoop.hbase.regionserver.RSRpcServices.scan(RSRpcServices.java:3462)
        at 
org.apache.hadoop.hbase.regionserver.RSRpcServices.scan(RSRpcServices.java:3733)
        at 
org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos$ClientService$2.callBlockingMethod(ClientProtos.java:45708)
        at org.apache.hadoop.hbase.ipc.RpcServer.call(RpcServer.java:444)
        at org.apache.hadoop.hbase.ipc.CallRunner.run(CallRunner.java:124)
        at org.apache.hadoop.hbase.ipc.RpcHandler.run(RpcHandler.java:105)
        at org.apache.hadoop.hbase.ipc.RpcHandler.run(RpcHandler.java:85)
Caused by: java.lang.NullPointerException: Cannot read the array length because 
"first" is null
        at org.apache.phoenix.util.ByteUtil.concat(ByteUtil.java:290)
        at 
org.apache.phoenix.iterate.NonAggregateRegionScannerFactory.getOffsetScanner(NonAggregateRegionScannerFactory.java:385)
        at 
org.apache.phoenix.iterate.NonAggregateRegionScannerFactory.getRegionScanner(NonAggregateRegionScannerFactory.java:186)
        at 
org.apache.phoenix.coprocessor.ScanRegionObserver.doPostScannerOpen(ScanRegionObserver.java:178)
        at 
org.apache.phoenix.coprocessor.BaseScannerRegionObserver$RegionScannerHolder.overrideDelegate(BaseScannerRegionObserver.java:218)
        ... 8 more

        at 
java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native
 Method)
        at 
java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
        at 
java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at 
java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
        at 
java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)
        at 
org.apache.hadoop.hbase.ipc.RemoteWithExtrasException.instantiateException(RemoteWithExtrasException.java:110)
        at 
org.apache.hadoop.hbase.ipc.RemoteWithExtrasException.unwrapRemoteException(RemoteWithExtrasException.java:100)
        at 
org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil.makeIOExceptionOfException(ProtobufUtil.java:398)
        at 
org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil.handleRemoteException(ProtobufUtil.java:386)
        at 
org.apache.hadoop.hbase.client.ScannerCallable.openScanner(ScannerCallable.java:377)
        at 
org.apache.hadoop.hbase.client.ScannerCallable.rpcCall(ScannerCallable.java:261)
        at 
org.apache.hadoop.hbase.client.ScannerCallable.rpcCall(ScannerCallable.java:62)
        at 
org.apache.hadoop.hbase.client.RegionServerCallable.call(RegionServerCallable.java:131)
        at 
org.apache.hadoop.hbase.client.RpcRetryingCallerImpl.callWithoutRetries(RpcRetryingCallerImpl.java:206)
        at 
org.apache.hadoop.hbase.client.ScannerCallableWithReplicas$RetryingRPC.call(ScannerCallableWithReplicas.java:438)
        at 
org.apache.hadoop.hbase.client.ScannerCallableWithReplicas$RetryingRPC.call(ScannerCallableWithReplicas.java:406)
        at 
org.apache.hadoop.hbase.client.RpcRetryingCallerImpl.callWithRetries(RpcRetryingCallerImpl.java:104)
        at 
org.apache.hadoop.hbase.client.ResultBoundedCompletionService$QueueingFuture.run(ResultBoundedCompletionService.java:74)
        at 
java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
        at 
java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
        at java.base/java.lang.Thread.run(Thread.java:842)
Caused by: 
org.apache.hadoop.hbase.ipc.RemoteWithExtrasException(org.apache.hadoop.hbase.DoNotRetryIOException):
 org.apache.hadoop.hbase.DoNotRetryIOException: 
USERS,,1790668034952.69aee508a9784b9651f42254e187be11.: Cannot read the array 
length because "first" is null
        at 
org.apache.phoenix.util.ClientUtil.createIOException(ClientUtil.java:180)
        at 
org.apache.phoenix.util.ClientUtil.throwIOException(ClientUtil.java:188)
        at 
org.apache.phoenix.coprocessor.BaseScannerRegionObserver$RegionScannerHolder.overrideDelegate(BaseScannerRegionObserver.java:237)
        at 
org.apache.phoenix.coprocessor.BaseScannerRegionObserver$RegionScannerHolder.nextRaw(BaseScannerRegionObserver.java:265)
        at 
org.apache.hadoop.hbase.regionserver.RSRpcServices.scan(RSRpcServices.java:3462)
        at 
org.apache.hadoop.hbase.regionserver.RSRpcServices.scan(RSRpcServices.java:3733)
        at 
org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos$ClientService$2.callBlockingMethod(ClientProtos.java:45708)
        at org.apache.hadoop.hbase.ipc.RpcServer.call(RpcServer.java:444)
        at org.apache.hadoop.hbase.ipc.CallRunner.run(CallRunner.java:124)
        at org.apache.hadoop.hbase.ipc.RpcHandler.run(RpcHandler.java:105)
        at org.apache.hadoop.hbase.ipc.RpcHandler.run(RpcHandler.java:85)
{color:#FF0000}*Caused by: java.lang.NullPointerException: Cannot read the 
array length because "first" is null*{color}
{color:#FF0000}        *at 
org.apache.phoenix.util.ByteUtil.concat(ByteUtil.java:290)*{color}
{color:#FF0000}        *at 
org.apache.phoenix.iterate.NonAggregateRegionScannerFactory.getOffsetScanner(NonAggregateRegionScannerFactory.java:385)*{color}
{color:#FF0000}        *at 
org.apache.phoenix.iterate.NonAggregateRegionScannerFactory.getRegionScanner(NonAggregateRegionScannerFactory.java:186)*{color}
{color:#FF0000}        *at 
org.apache.phoenix.coprocessor.ScanRegionObserver.doPostScannerOpen(ScanRegionObserver.java:178)*{color}
{color:#FF0000}        *at 
org.apache.phoenix.coprocessor.BaseScannerRegionObserver$RegionScannerHolder.overrideDelegate(BaseScannerRegionObserver.java:218)*{color}
{color:#FF0000}        *... 8 more*{color}

        at 
org.apache.hadoop.hbase.ipc.AbstractRpcClient.onCallFinished(AbstractRpcClient.java:392)
        at 
org.apache.hadoop.hbase.ipc.AbstractRpcClient.access$100(AbstractRpcClient.java:94)
        at 
org.apache.hadoop.hbase.ipc.AbstractRpcClient$3.run(AbstractRpcClient.java:430)
        at 
org.apache.hadoop.hbase.ipc.AbstractRpcClient$3.run(AbstractRpcClient.java:425)
        at org.apache.hadoop.hbase.ipc.Call.callComplete(Call.java:116)
        at org.apache.hadoop.hbase.ipc.Call.setException(Call.java:131)
        at 
org.apache.hadoop.hbase.ipc.RpcConnection.readResponse(RpcConnection.java:457)
        at 
org.apache.hadoop.hbase.ipc.NettyRpcDuplexHandler.readResponse(NettyRpcDuplexHandler.java:125)
        at 
org.apache.hadoop.hbase.ipc.NettyRpcDuplexHandler.channelRead(NettyRpcDuplexHandler.java:140)
        at 
org.apache.hbase.thirdparty.io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442)
        at 
org.apache.hbase.thirdparty.io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
        at 
org.apache.hbase.thirdparty.io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
        at 
org.apache.hbase.thirdparty.io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:361)
        at 
org.apache.hbase.thirdparty.io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:325)
        at 
org.apache.hbase.thirdparty.io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
        at 
org.apache.hbase.thirdparty.io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
        at 
org.apache.hbase.thirdparty.io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
        at 
org.apache.hbase.thirdparty.io.netty.handler.timeout.IdleStateHandler.channelRead(IdleStateHandler.java:289)
        at 
org.apache.hbase.thirdparty.io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442)
        at 
org.apache.hbase.thirdparty.io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
        at 
org.apache.hbase.thirdparty.io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
        at 
org.apache.hbase.thirdparty.io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1357)
        at 
org.apache.hbase.thirdparty.io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:440)
        at 
org.apache.hbase.thirdparty.io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
        at 
org.apache.hbase.thirdparty.io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:868)
        at 
org.apache.hbase.thirdparty.io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:171)
        at 
org.apache.hbase.thirdparty.io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:796)
        at 
org.apache.hbase.thirdparty.io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:732)
        at 
org.apache.hbase.thirdparty.io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:658)
        at 
org.apache.hbase.thirdparty.io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:562)
        at 
org.apache.hbase.thirdparty.io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:998)
        at 
org.apache.hbase.thirdparty.io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
        at 
org.apache.hbase.thirdparty.io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
        ... 1 more
2026-09-29T13:17:15,673 ERROR [main] iterate.TableResultIterator: Error while 
scanning table USERS;hconnection-0x153cd6bb , scan 
\{"totalColumns":2,"maxResultSize":"-1","caching":2147483647,"includeStopRow":false,"consistency":"STRONG","maxVersions":1,"mvccReadPoint":"-1","includeStartRow":true,"stopRow":"\\x80\\x00\\x00\\x06","limit":-1,"timeRange":["0","9223372036854775807"],"loadColumnFamiliesOnDemand":true,"startRow":"\\x80\\x00\\x00\\x05","targetReplicaId":-1,"batch":-1,"families":{"0":["\\x00\\x00\\x00\\x00","\\x80\\x0B"]},"priority":-1,"filter":"PageFilter
 
5","storeOffset":0,"queryMetricsEnabled":false,"needCursorResult":false,"storeLimit":-1,"cacheBlocks":true,"readType":"PREAD","allowPartialResults":false,"reversed":false}
Error: org.apache.hadoop.hbase.DoNotRetryIOException: 
USERS,,1790668034952.69aee508a9784b9651f42254e187be11.: Cannot read the array 
length because "first" is null
        at 
org.apache.phoenix.util.ClientUtil.createIOException(ClientUtil.java:180)
        at 
org.apache.phoenix.util.ClientUtil.throwIOException(ClientUtil.java:188)
        at 
org.apache.phoenix.coprocessor.BaseScannerRegionObserver$RegionScannerHolder.overrideDelegate(BaseScannerRegionObserver.java:237)
        at 
org.apache.phoenix.coprocessor.BaseScannerRegionObserver$RegionScannerHolder.nextRaw(BaseScannerRegionObserver.java:265)
        at 
org.apache.hadoop.hbase.regionserver.RSRpcServices.scan(RSRpcServices.java:3462)
        at 
org.apache.hadoop.hbase.regionserver.RSRpcServices.scan(RSRpcServices.java:3733)
        at 
org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos$ClientService$2.callBlockingMethod(ClientProtos.java:45708)
        at org.apache.hadoop.hbase.ipc.RpcServer.call(RpcServer.java:444)
        at org.apache.hadoop.hbase.ipc.CallRunner.run(CallRunner.java:124)
        at org.apache.hadoop.hbase.ipc.RpcHandler.run(RpcHandler.java:105)
        at org.apache.hadoop.hbase.ipc.RpcHandler.run(RpcHandler.java:85)
Caused by: java.lang.NullPointerException: Cannot read the array length because 
"first" is null
        at org.apache.phoenix.util.ByteUtil.concat(ByteUtil.java:290)
        at 
org.apache.phoenix.iterate.NonAggregateRegionScannerFactory.getOffsetScanner(NonAggregateRegionScannerFactory.java:385)
        at 
org.apache.phoenix.iterate.NonAggregateRegionScannerFactory.getRegionScanner(NonAggregateRegionScannerFactory.java:186)
        at 
org.apache.phoenix.coprocessor.ScanRegionObserver.doPostScannerOpen(ScanRegionObserver.java:178)
        at 
org.apache.phoenix.coprocessor.BaseScannerRegionObserver$RegionScannerHolder.overrideDelegate(BaseScannerRegionObserver.java:218)
        ... 8 more (state=08000,code=101)
0: jdbc:phoenix:> SELECT * FROM users WHERE id = 5 LIMIT 5;
+----+------+
| ID | NAME |
+----+------+
| 5  | e    |
+----+------+
1 row selected (0.019 seconds)
0: jdbc:phoenix:> SELECT * FROM users;
+----+------+
| ID | NAME |
+----+------+
| 5  | e    |
+----+------+
1 row selected (0.009 seconds)
0: jdbc:phoenix:> 

> NPE in NonAggregateRegionScannerFactory.getOffsetScanner() for point-lookup 
> queries with OFFSET
> -----------------------------------------------------------------------------------------------
>
>                 Key: PHOENIX-8010
>                 URL: https://issues.apache.org/jira/browse/PHOENIX-8010
>             Project: Phoenix
>          Issue Type: Bug
>    Affects Versions: 5.2.2, 5.3.2
>         Environment: h2. Environment
>  * Reproduced on Phoenix branch-5.3.0 with HBase 2.6.4.
>  * Code path is byte-identical across all 5.x branches and master; HBase 
> version is irrelevant.
>            Reporter: Xavier Fernandis
>            Assignee: Xavier Fernandis
>            Priority: Major
>
> h2. Root cause
> The crash is in {{getOffsetScanner(...)}} in:
> {{phoenix-core-server/src/main/java/org/apache/phoenix/iterate/NonAggregateRegionScannerFactory.java}}
> {code:java}
> byte[] prevScanStartRowKey =
>   scan.getAttribute(BaseScannerRegionObserverConstants.SCAN_ACTUAL_START_ROW);
> // If the region has moved after server has returned dummy or valid row to 
> client,
> // prevScanStartRowKey would be different from actual scan start rowkey.
> // ...
> if (
>   Bytes.compareTo(prevScanStartRowKey, initStartRowKey) != 0 && Bytes
>     .compareTo(ByteUtil.concat(prevScanStartRowKey, ByteUtil.ZERO_BYTE), 
> initStartRowKey) != 0
> ) {
>   iterator.setRowCountToOffset();
> }{code}
> {{ }}
> {{prevScanStartRowKey}} is the value of the {{SCAN_ACTUAL_START_ROW}} . On 
> the first RPC of a point-lookup query this attribute was never set on the 
> client, so it is {{{}null{}}}.
>  * {{org.apache.hadoop.hbase.util.Bytes.compareTo(byte[], byte[])}} is 
> null-tolerant, so the first comparison does *not* throw.
>  * {{org.apache.phoenix.util.ByteUtil.concat(byte[] first, byte[]... rest)}} 
> is *not* null-tolerant. It dereferences {{first.length}} immediately, so 
> {{concat(null, ByteUtil.ZERO_BYTE)}} throws.
> Offending line in:
> {{phoenix-core-client/src/main/java/org/apache/phoenix/util/ByteUtil.java}}
>  
> {code:java}
>  
> public static byte[] concat(byte[] first, byte[]... rest) {
>  int totalLength = first.length; // <-- NPE when first == null ... 
> }
> {code}
>  
> Every range / salted / local-index / guide-post-split scan is produced 
> through {{{}intersectScan(...){}}}, so those paths always carry the 
> attribute. But the *point-lookup fast path* in 
> {{{}BaseResultIterators.getParallelScans(byte[], byte[]){}}}:
> {code:java}
> if (!isLocalIndex && scanRanges.isPointLookup() && 
> !scanRanges.useSkipScanFilter()) {
>     // builds the scan directly from context.getScan(); never calls 
> intersectScan(...)
>     // ... and therefore never sets SCAN_ACTUAL_START_ROW
> }
> {code}
> {{ }}



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to