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)

Reply via email to