[ https://issues.apache.org/jira/browse/IGNITE-24810?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Mirza Aliev reassigned IGNITE-24810: ------------------------------------ Assignee: Mirza Aliev > 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 > Assignee: Mirza Aliev > Priority: Major > Labels: ignite-3 > Time Spent: 20m > Remaining Estimate: 0h > > 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)