Sergey Shcherbakov created GEODE-537:
----------------------------------------

             Summary: NPE in JTA AFTER_COMPLETION command processing
                 Key: GEODE-537
                 URL: https://issues.apache.org/jira/browse/GEODE-537
             Project: Geode
          Issue Type: Bug
          Components: core
            Reporter: Sergey Shcherbakov


A NullPinterException is being thrown on the server side and propagated to the 
Gemfire client in case when a running JTA transaction being rolled back:

{code}
2015-10-30 11:39:09.614  WARN 4623 --- [rTaskExecutor-1] 
com.atomikos.icatch.imp.CoordinatorImp   : Unexpected error in afterCompletion
java.lang.NullPointerException: null
        at 
com.gemstone.gemfire.internal.cache.tier.sockets.command.CommitCommand.writeCommitResponse(CommitCommand.java:122)
 ~[gemfire-core-1.0.0-incubating-SNAPSHOT.jar:na]
        at 
com.gemstone.gemfire.internal.cache.tier.sockets.command.TXSynchronizationCommand$2.run(TXSynchronizationCommand.java:152)
 ~[gemfire-core-1.0.0-incubating-SNAPSHOT.jar:na]
        at 
com.gemstone.gemfire.internal.cache.tier.sockets.command.TXSynchronizationCommand.cmdExecute(TXSynchronizationCommand.java:196)
 ~[gemfire-core-1.0.0-incubating-SNAPSHOT.jar:na]
        at 
com.gemstone.gemfire.internal.cache.tier.sockets.BaseCommand.execute(BaseCommand.java:191)
 ~[gemfire-core-1.0.0-incubating-SNAPSHOT.jar:na]
        at 
com.gemstone.gemfire.internal.cache.tier.sockets.ServerConnection.doNormalMsg(ServerConnection.java:796)
 ~[gemfire-core-1.0.0-incubating-SNAPSHOT.jar:na]
        at 
com.gemstone.gemfire.internal.cache.tier.sockets.ServerConnection.doOneMessage(ServerConnection.java:923)
 ~[gemfire-core-1.0.0-incubating-SNAPSHOT.jar:na]
        at 
com.gemstone.gemfire.internal.cache.tier.sockets.ServerConnection.run(ServerConnection.java:1168)
 ~[gemfire-core-1.0.0-incubating-SNAPSHOT.jar:na]
        at 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
[na:1.8.0_05]
        at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
[na:1.8.0_05]
        at 
com.gemstone.gemfire.internal.cache.tier.sockets.AcceptorImpl$1$1.run(AcceptorImpl.java:563)
 ~[gemfire-core-1.0.0-incubating-SNAPSHOT.jar:na]
        ... 1 common frames omitted
Wrapped by: com.gemstone.gemfire.cache.client.ServerOperationException: remote 
server on crake(4623:loner):56169:166154b8: While performing a remote 
AFTER_COMPLETION
        at 
com.gemstone.gemfire.cache.client.internal.AbstractOp.processObjResponse(AbstractOp.java:293)
 ~[gemfire-core-1.0.0-incubating-SNAPSHOT.jar:na]
        at 
com.gemstone.gemfire.cache.client.internal.TXSynchronizationOp$Impl.processResponse(TXSynchronizationOp.java:119)
 ~[gemfire-core-1.0.0-incubating-SNAPSHOT.jar:na]
        at 
com.gemstone.gemfire.cache.client.internal.AbstractOp.processResponse(AbstractOp.java:224)
 ~[gemfire-core-1.0.0-incubating-SNAPSHOT.jar:na]
        at 
com.gemstone.gemfire.cache.client.internal.AbstractOp.attemptReadResponse(AbstractOp.java:175)
 ~[gemfire-core-1.0.0-incubating-SNAPSHOT.jar:na]
        at 
com.gemstone.gemfire.cache.client.internal.AbstractOp.attempt(AbstractOp.java:378)
 ~[gemfire-core-1.0.0-incubating-SNAPSHOT.jar:na]
        at 
com.gemstone.gemfire.cache.client.internal.ConnectionImpl.execute(ConnectionImpl.java:273)
 ~[gemfire-core-1.0.0-incubating-SNAPSHOT.jar:na]
        at 
com.gemstone.gemfire.cache.client.internal.pooling.PooledConnection.execute(PooledConnection.java:329)
 ~[gemfire-core-1.0.0-incubating-SNAPSHOT.jar:na]
        at 
com.gemstone.gemfire.cache.client.internal.OpExecutorImpl.executeWithPossibleReAuthentication(OpExecutorImpl.java:939)
 ~[gemfire-core-1.0.0-incubating-SNAPSHOT.jar:na]
        at 
com.gemstone.gemfire.cache.client.internal.OpExecutorImpl.executeOnServer(OpExecutorImpl.java:379)
 ~[gemfire-core-1.0.0-incubating-SNAPSHOT.jar:na]
        at 
com.gemstone.gemfire.cache.client.internal.OpExecutorImpl.executeWithServerAffinity(OpExecutorImpl.java:229)
 ~[gemfire-core-1.0.0-incubating-SNAPSHOT.jar:na]
        at 
com.gemstone.gemfire.cache.client.internal.OpExecutorImpl.execute(OpExecutorImpl.java:135)
 ~[gemfire-core-1.0.0-incubating-SNAPSHOT.jar:na]
        at 
com.gemstone.gemfire.cache.client.internal.OpExecutorImpl.execute(OpExecutorImpl.java:122)
 ~[gemfire-core-1.0.0-incubating-SNAPSHOT.jar:na]
        at 
com.gemstone.gemfire.cache.client.internal.PoolImpl.execute(PoolImpl.java:712) 
~[gemfire-core-1.0.0-incubating-SNAPSHOT.jar:na]
        at 
com.gemstone.gemfire.cache.client.internal.TXSynchronizationOp.execute(TXSynchronizationOp.java:52)
 ~[gemfire-core-1.0.0-incubating-SNAPSHOT.jar:na]
        at 
com.gemstone.gemfire.cache.client.internal.ServerRegionProxy.afterCompletion(ServerRegionProxy.java:860)
 ~[gemfire-core-1.0.0-incubating-SNAPSHOT.jar:na]
        at 
com.gemstone.gemfire.internal.cache.tx.ClientTXStateStub.afterCompletion(ClientTXStateStub.java:213)
 ~[gemfire-core-1.0.0-incubating-SNAPSHOT.jar:na]
        at 
com.gemstone.gemfire.internal.cache.TXStateProxyImpl.afterCompletion(TXStateProxyImpl.java:539)
 ~[gemfire-core-1.0.0-incubating-SNAPSHOT.jar:na]
        at com.atomikos.icatch.jta.Sync2Sync.afterCompletion(Sync2Sync.java:73) 
~[transactions-jta-3.9.3.jar:na]
        at 
com.atomikos.icatch.imp.CoordinatorImp.notifySynchronizationsAfterCompletion(CoordinatorImp.java:547)
 [transactions-3.9.3.jar:na]
        at 
com.atomikos.icatch.imp.CoordinatorStateHandler.rollbackWithAfterCompletionNotification(CoordinatorStateHandler.java:833)
 [transactions-3.9.3.jar:na]
        at 
com.atomikos.icatch.imp.ActiveStateHandler.rollbackWithAfterCompletionNotification(ActiveStateHandler.java:49)
 [transactions-3.9.3.jar:na]
        at 
com.atomikos.icatch.imp.ActiveStateHandler.rollback(ActiveStateHandler.java:314)
 [transactions-3.9.3.jar:na]
        at 
com.atomikos.icatch.imp.CoordinatorImp.rollback(CoordinatorImp.java:741) 
[transactions-3.9.3.jar:na]
        at 
com.atomikos.icatch.imp.TransactionStateHandler.rollback(TransactionStateHandler.java:185)
 [transactions-3.9.3.jar:na]
        at 
com.atomikos.icatch.imp.TransactionStateHandler.rollbackWithStateCheck(TransactionStateHandler.java:203)
 [transactions-3.9.3.jar:na]
        at 
com.atomikos.icatch.imp.CompositeTransactionImp.doRollback(CompositeTransactionImp.java:237)
 [transactions-3.9.3.jar:na]
        at 
com.atomikos.icatch.imp.CompositeTerminatorImp.rollback(CompositeTerminatorImp.java:123)
 [transactions-3.9.3.jar:na]
        at 
com.atomikos.icatch.imp.CompositeTransactionImp.rollback(CompositeTransactionImp.java:346)
 [transactions-3.9.3.jar:na]
        at 
com.atomikos.icatch.jta.TransactionImp.rollback(TransactionImp.java:217) 
[transactions-jta-3.9.3.jar:na]
        at 
com.atomikos.icatch.jta.TransactionManagerImp.rollback(TransactionManagerImp.java:448)
 [transactions-jta-3.9.3.jar:na]
        at 
com.atomikos.icatch.jta.UserTransactionManager.rollback(UserTransactionManager.java:217)
 [transactions-jta-3.9.3.jar:na]
        at 
org.springframework.transaction.jta.JtaTransactionManager.doRollback(JtaTransactionManager.java:1048)
 [spring-tx-4.2.2.RELEASE.jar:4.2.2.RELEASE]
        at 
org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback(AbstractPlatformTransactionManager.java:853)
 [spring-tx-4.2.2.RELEASE.jar:4.2.2.RELEASE]
        at 
org.springframework.transaction.support.AbstractPlatformTransactionManager.rollback(AbstractPlatformTransactionManager.java:830)
 [spring-tx-4.2.2.RELEASE.jar:4.2.2.RELEASE]
        at 
org.springframework.transaction.support.TransactionTemplate.rollbackOnException(TransactionTemplate.java:164)
 [spring-tx-4.2.2.RELEASE.jar:4.2.2.RELEASE]
        at 
org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:137)
 [spring-tx-4.2.2.RELEASE.jar:4.2.2.RELEASE]
        at 
com.murex.demo.tx.publisher.SimplePublishService.publish(SimplePublishService.java:49)
 [classes/:na]
        at 
com.murex.demo.tx.publisher.Publisher$PublisherTask.run(Publisher.java:55) 
[classes/:na]
        at 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
[na:1.8.0_05]
        at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
[na:1.8.0_05]
        at java.lang.Thread.run(Thread.java:745) [na:1.8.0_05]
{code}

The reason is that the response object in this case is not set at this point:
https://github.com/apache/incubator-geode/blob/develop/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/tier/sockets/command/CommitCommand.java#L122

A sequence that leads to the error is following:
<JTA Transaction Manager>.begin()
region.put()
<JTA Transaction Manager>.registerSynchronization(TXStateProxyImpl)
<JTA Transaction Manager>.rollback() 
TXStateProxyImpl.beforeCompletion()
TXStateProxyImpl.afterCompletion()

Im my scenario the transaction looks to roll back successfully even after NPE 
is thrown. Still some parts of the relevant code might be missed in that case 
and could lead potentially to other problems.





--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to