You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@geode.apache.org by "Edin Zulich (JIRA)" <ji...@apache.org> on 2016/02/13 00:48:18 UTC
[jira] [Resolved] (GEODE-537) NPE in JTA AFTER_COMPLETION command
processing
[ https://issues.apache.org/jira/browse/GEODE-537?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Edin Zulich resolved GEODE-537.
-------------------------------
Resolution: Fixed
Fix Version/s: 1.0.0-incubating.M1
> 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
> Fix For: 1.0.0-incubating.M1
>
>
> A NullPointerException is being thrown on the server side and propagated to the Gemfire client in case when a running JTA transaction gets 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] possibly because no beforeCompletion() was called in this rollback scenario (I am using Atomikos JTA implementation for the test).
> 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.afterCompletion(STATUS_ROLLEDBACK)
> 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 (e.g. [leaving hosted TX state behind|https://github.com/apache/incubator-geode/blob/develop/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/tier/sockets/command/TXSynchronizationCommand.java#L153])
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)