Mirza Aliev created IGNITE-24810: ------------------------------------ Summary: NPE when querying system.locks table Key: IGNITE-24810 URL: https://issues.apache.org/jira/browse/IGNITE-24810 Project: Ignite Issue Type: Bug Reporter: Mirza Aliev
Under a specific circumstance (100% reproducible), we can trigger an NPE when we read system.locks table. Circumstance: Two transactions running where there is key overlap and one transaction is already waiting on the other to finish. i.e. # TX 1 started and performs insert key 1 - 10 # Before TX1 starts writing to key 5, TX 2 is started and performs insert key 5 - 20. # Once TX1 is at key 5, it will have to wait for TX2 to finish since it it holding the lock. # Using CLI, querying system.locks table (select count(tx_id) from system.locks;) Very corner case situation but maybe some improvements can be made (e.g. assert) Error in CLI {noformat} sql-cli> select count(tx_id) from system.locks; SQL query execution error Cannot invoke "org.apache.ignite.internal.tx.LockMode.name()" because the return value of "org.apache.ignite.internal.tx.Lock.lockMode()" is null 2025-02-20 15:57:11:872 -0500 [INFO][%defaultNode%sql-execution-pool-3][ExchangeServiceImpl] Failed to execute query fragment: traceId=148683a0-0d29-409b-9a1b-74308bf31aca, executionId=ExecutionId [queryId=ffffffff-e5f1-efe3-0000-0000000115b0, executionToken=71284], fragmentId=1 org.apache.ignite.internal.lang.IgniteInternalException: IGN-CMN-65535 TraceId:148683a0-0d29-409b-9a1b-74308bf31aca Cannot invoke "org.apache.ignite.internal.tx.LockMode.name()" because the return value of "org.apache.ignite.internal.tx.Lock.lockMode()" is null at org.apache.ignite.internal.sql.engine.exec.ExchangeServiceImpl.sendError(ExchangeServiceImpl.java:115) at org.apache.ignite.internal.sql.engine.exec.rel.Outbox.sendError(Outbox.java:286) at org.apache.ignite.internal.sql.engine.exec.rel.Outbox.onError(Outbox.java:183) at org.apache.ignite.internal.sql.engine.exec.rel.AbstractNode.onError(AbstractNode.java:135) at org.apache.ignite.internal.sql.engine.exec.rel.AbstractNode.onError(AbstractNode.java:135) at org.apache.ignite.internal.sql.engine.exec.ExecutionContext.lambda$execute$0(ExecutionContext.java:370) at org.apache.ignite.internal.sql.engine.exec.QueryTaskExecutorImpl.lambda$execute$0(QueryTaskExecutorImpl.java:78) 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: java.lang.NullPointerException: Cannot invoke "org.apache.ignite.internal.tx.LockMode.name()" because the return value of "org.apache.ignite.internal.tx.Lock.lockMode()" is null at org.apache.ignite.internal.tx.views.LocksViewProvider.lambda$get$2(LocksViewProvider.java:38) at org.apache.ignite.internal.systemview.SystemViewManagerImpl$ScannableView.lambda$new$0(SystemViewManagerImpl.java:265) at org.apache.ignite.internal.util.subscription.TransformingPublisher$SubscriberImpl.onNext(TransformingPublisher.java:52) at org.apache.ignite.internal.util.subscription.IterableToPublisherAdapter$SubscriptionImpl.drain(IterableToPublisherAdapter.java:151) at org.apache.ignite.internal.util.subscription.IterableToPublisherAdapter$SubscriptionImpl.lambda$request$0(IterableToPublisherAdapter.java:125) at java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:863) at java.base/java.util.concurrent.CompletableFuture.uniWhenCompleteStage(CompletableFuture.java:887) at java.base/java.util.concurrent.CompletableFuture.whenComplete(CompletableFuture.java:2325) at org.apache.ignite.internal.util.subscription.IterableToPublisherAdapter$SubscriptionImpl.request(IterableToPublisherAdapter.java:118) at org.apache.ignite.internal.sql.engine.exec.rel.StorageScanNode.requestNextBatch(StorageScanNode.java:184) at org.apache.ignite.internal.sql.engine.exec.rel.StorageScanNode.push(StorageScanNode.java:158) at org.apache.ignite.internal.sql.engine.exec.rel.AbstractNode.lambda$execute$0(AbstractNode.java:114) at org.apache.ignite.internal.sql.engine.exec.ExecutionContext.lambda$execute$0(ExecutionContext.java:366) ... 4 more 2025-02-20 15:57:11:877 -0500 [WARNING][%defaultNode%sql-execution-pool-3][ExecutionContext] Unexpected exception java.lang.NullPointerException: Cannot invoke "org.apache.ignite.internal.tx.LockMode.name()" because the return value of "org.apache.ignite.internal.tx.Lock.lockMode()" is null at org.apache.ignite.internal.tx.views.LocksViewProvider.lambda$get$2(LocksViewProvider.java:38) at org.apache.ignite.internal.systemview.SystemViewManagerImpl$ScannableView.lambda$new$0(SystemViewManagerImpl.java:265) at org.apache.ignite.internal.util.subscription.TransformingPublisher$SubscriberImpl.onNext(TransformingPublisher.java:52) at org.apache.ignite.internal.util.subscription.IterableToPublisherAdapter$SubscriptionImpl.drain(IterableToPublisherAdapter.java:151) at org.apache.ignite.internal.util.subscription.IterableToPublisherAdapter$SubscriptionImpl.lambda$request$0(IterableToPublisherAdapter.java:125) at java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:863) at java.base/java.util.concurrent.CompletableFuture.uniWhenCompleteStage(CompletableFuture.java:887) at java.base/java.util.concurrent.CompletableFuture.whenComplete(CompletableFuture.java:2325) at org.apache.ignite.internal.util.subscription.IterableToPublisherAdapter$SubscriptionImpl.request(IterableToPublisherAdapter.java:118) at org.apache.ignite.internal.sql.engine.exec.rel.StorageScanNode.requestNextBatch(StorageScanNode.java:184) at org.apache.ignite.internal.sql.engine.exec.rel.StorageScanNode.push(StorageScanNode.java:158) at org.apache.ignite.internal.sql.engine.exec.rel.AbstractNode.lambda$execute$0(AbstractNode.java:114) at org.apache.ignite.internal.sql.engine.exec.ExecutionContext.lambda$execute$0(ExecutionContext.java:366) at org.apache.ignite.internal.sql.engine.exec.QueryTaskExecutorImpl.lambda$execute$0(QueryTaskExecutorImpl.java:78) 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) 2025-02-20 15:57:11:884 -0500 [INFO][%defaultNode%sql-execution-pool-3][JdbcQueryEventHandlerImpl] Exception while executing query. org.apache.ignite.sql.SqlException: IGN-CMN-65535 TraceId:148683a0-0d29-409b-9a1b-74308bf31aca Cannot invoke "org.apache.ignite.internal.tx.LockMode.name()" because the return value of "org.apache.ignite.internal.tx.Lock.lockMode()" is null at org.apache.ignite.internal.lang.SqlExceptionMapperUtil.mapToPublicSqlException(SqlExceptionMapperUtil.java:65) at org.apache.ignite.internal.sql.engine.exec.TxAwareAsyncCursor.wrapIfNecessary(TxAwareAsyncCursor.java:152) at org.apache.ignite.internal.sql.engine.exec.TxAwareAsyncCursor.handleError(TxAwareAsyncCursor.java:127) at org.apache.ignite.internal.sql.engine.exec.TxAwareAsyncCursor.lambda$requestNextAsync$2(TxAwareAsyncCursor.java:60) at java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934) at java.base/java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911) at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510) at java.base/java.util.concurrent.CompletableFuture.completeExceptionally(CompletableFuture.java:2162) at org.apache.ignite.internal.sql.engine.exec.rel.AsyncRootNode.lambda$closeAsync$0(AsyncRootNode.java:168) at java.base/java.util.concurrent.ConcurrentLinkedQueue.forEachFrom(ConcurrentLinkedQueue.java:1037) at java.base/java.util.concurrent.ConcurrentLinkedQueue.forEach(ConcurrentLinkedQueue.java:1054) at org.apache.ignite.internal.sql.engine.exec.rel.AsyncRootNode.closeAsync(AsyncRootNode.java:168) at org.apache.ignite.internal.sql.engine.exec.rel.AsyncRootNode.onError(AsyncRootNode.java:122) at org.apache.ignite.internal.sql.engine.exec.ExecutionServiceImpl$DistributedQueryManager.lambda$onError$2(ExecutionServiceImpl.java:979) at java.base/java.util.concurrent.CompletableFuture.uniAcceptNow(CompletableFuture.java:757) at java.base/java.util.concurrent.CompletableFuture.uniAcceptStage(CompletableFuture.java:735) at java.base/java.util.concurrent.CompletableFuture.thenAccept(CompletableFuture.java:2182) at org.apache.ignite.internal.sql.engine.exec.ExecutionServiceImpl$DistributedQueryManager.onError(ExecutionServiceImpl.java:978) at org.apache.ignite.internal.sql.engine.exec.ExecutionServiceImpl.onMessage(ExecutionServiceImpl.java:672) at org.apache.ignite.internal.sql.engine.exec.ExecutionServiceImpl.lambda$start$4(ExecutionServiceImpl.java:322) at org.apache.ignite.internal.sql.engine.message.MessageServiceImpl.onMessageInternal(MessageServiceImpl.java:158) at org.apache.ignite.internal.sql.engine.message.MessageServiceImpl.lambda$onMessage$2(MessageServiceImpl.java:124) at org.apache.ignite.internal.sql.engine.exec.QueryTaskExecutorImpl.lambda$execute$0(QueryTaskExecutorImpl.java:78) 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.ignite.lang.IgniteException: IGN-CMN-65535 TraceId:148683a0-0d29-409b-9a1b-74308bf31aca Cannot invoke "org.apache.ignite.internal.tx.LockMode.name()" because the return value of "org.apache.ignite.internal.tx.Lock.lockMode()" is null at org.apache.ignite.internal.sql.engine.util.SqlExceptionMapperProvider.lambda$mappers$1(SqlExceptionMapperProvider.java:50) at org.apache.ignite.internal.lang.IgniteExceptionMapper.map(IgniteExceptionMapper.java:53) at org.apache.ignite.internal.lang.IgniteExceptionMapperUtil.map(IgniteExceptionMapperUtil.java:187) at org.apache.ignite.internal.lang.IgniteExceptionMapperUtil.mapToPublicException(IgniteExceptionMapperUtil.java:117) at org.apache.ignite.internal.lang.IgniteExceptionMapperUtil.mapToPublicException(IgniteExceptionMapperUtil.java:80) at org.apache.ignite.internal.lang.SqlExceptionMapperUtil.mapToPublicSqlException(SqlExceptionMapperUtil.java:55) ... 25 more Caused by: org.apache.ignite.internal.sql.engine.exec.RemoteFragmentExecutionException: IGN-CMN-65535 TraceId:148683a0-0d29-409b-9a1b-74308bf31aca Cannot invoke "org.apache.ignite.internal.tx.LockMode.name()" because the return value of "org.apache.ignite.internal.tx.Lock.lockMode()" is null at org.apache.ignite.internal.sql.engine.exec.ExecutionServiceImpl.onMessage(ExecutionServiceImpl.java:665) ... 7 more {noformat} -- This message was sent by Atlassian Jira (v8.20.10#820010)