Repository: incubator-geode Updated Branches: refs/heads/develop e1eb74eff -> 7cbaadc78
GEODE-537 Fix NPE in JTA AFTER_COMPLETION during rollback A fix for NullPointerException thrown on the server side and propagated to the Gemfire client in case when active JTA transaction gets rolled back. Project: http://git-wip-us.apache.org/repos/asf/incubator-geode/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-geode/commit/0f72d363 Tree: http://git-wip-us.apache.org/repos/asf/incubator-geode/tree/0f72d363 Diff: http://git-wip-us.apache.org/repos/asf/incubator-geode/diff/0f72d363 Branch: refs/heads/develop Commit: 0f72d363bae43a11f0c6d132076b99aedd8d834a Parents: cfbeaf2 Author: sshcherbakov <sshcherba...@gopivotal.com> Authored: Mon Nov 9 23:21:54 2015 +0100 Committer: sshcherbakov <sshcherba...@gopivotal.com> Committed: Mon Nov 9 23:30:22 2015 +0100 ---------------------------------------------------------------------- .../tier/sockets/command/CommitCommand.java | 4 +- .../tier/sockets/command/CommitCommandTest.java | 39 ++++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/0f72d363/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/tier/sockets/command/CommitCommand.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/tier/sockets/command/CommitCommand.java b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/tier/sockets/command/CommitCommand.java index 8d77874..6caf89a 100644 --- a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/tier/sockets/command/CommitCommand.java +++ b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/tier/sockets/command/CommitCommand.java @@ -119,7 +119,9 @@ public class CommitCommand extends BaseCommand { responseMsg.setMessageType(MessageType.RESPONSE); responseMsg.setTransactionId(origMsg.getTransactionId()); responseMsg.setNumberOfParts(1); - response.setClientVersion(servConn.getClientVersion()); + if( response != null ) { + response.setClientVersion(servConn.getClientVersion()); + } responseMsg.addObjPart(response, zipValues); servConn.getCache().getCancelCriterion().checkCancelInProgress(null); if (logger.isDebugEnabled()) { http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/0f72d363/gemfire-core/src/test/java/com/gemstone/gemfire/internal/cache/tier/sockets/command/CommitCommandTest.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/test/java/com/gemstone/gemfire/internal/cache/tier/sockets/command/CommitCommandTest.java b/gemfire-core/src/test/java/com/gemstone/gemfire/internal/cache/tier/sockets/command/CommitCommandTest.java new file mode 100644 index 0000000..1f9ce54 --- /dev/null +++ b/gemfire-core/src/test/java/com/gemstone/gemfire/internal/cache/tier/sockets/command/CommitCommandTest.java @@ -0,0 +1,39 @@ +package com.gemstone.gemfire.internal.cache.tier.sockets.command; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import java.io.IOException; + +import org.junit.Test; + +import com.gemstone.gemfire.CancelCriterion; +import com.gemstone.gemfire.cache.Cache; +import com.gemstone.gemfire.internal.cache.tier.sockets.Message; +import com.gemstone.gemfire.internal.cache.tier.sockets.ServerConnection; + +public class CommitCommandTest { + + /** + * Test for GEODE-537 + * No NPE should be thrown from the {@link CommitCommand.writeCommitResponse()} + * if the response message is null as it is the case when JTA + * transaction is rolled back with TX_SYNCHRONIZATION AFTER_COMPLETION STATUS_ROLLEDBACK + * @throws IOException + * + */ + @Test + public void testWriteNullResponse() throws IOException { + + Cache cache = mock(Cache.class); + Message origMsg = mock(Message.class); + ServerConnection servConn = mock(ServerConnection.class); + when(servConn.getResponseMessage()).thenReturn(mock(Message.class)); + when(servConn.getCache()).thenReturn(cache); + when(cache.getCancelCriterion()).thenReturn(mock(CancelCriterion.class)); + + CommitCommand.writeCommitResponse(null, origMsg, servConn); + + } + +}