@Override public void suspend() { this.serverAffinityLocation = this.firstProxy.getPool().getServerAffinityLocation(); this.firstProxy.getPool().releaseServerAffinity(); if (logger.isDebugEnabled()) { logger.debug("TX: suspending transaction: {} server delegate: {}", getTransactionId(), this.serverAffinityLocation); } }
@Override public void rollback() { if (this.internalAfterSendRollback != null) { this.internalAfterSendRollback.run(); } try { txRolledback = true; this.firstProxy.rollback(proxy.getTxId().getUniqId()); } finally { this.firstProxy.getPool().releaseServerAffinity(); } }
@Override public void afterCompletion(int status) { try { if (txRolledback) { return; } TXCommitMessage txcm = this.firstProxy.afterCompletion(status, proxy.getTxId().getUniqId()); if (status == Status.STATUS_COMMITTED) { if (txcm == null) { throw new TransactionInDoubtException( "Commit failed on cache server"); } else { afterServerCommit(txcm); } } else if (status == Status.STATUS_ROLLEDBACK) { if (this.internalAfterSendRollback != null) { this.internalAfterSendRollback.run(); } this.firstProxy.getPool().releaseServerAffinity(); } } finally { if (status == Status.STATUS_COMMITTED) { // rollback does not grab locks this.lockReq.releaseLocal(); } this.firstProxy.getPool().releaseServerAffinity(); } }
@Test public void commitReleasesServerAffinity_whenCommitThrowsAnException() { TXManagerImpl txManager = mock(TXManagerImpl.class); when(cache.getTxManager()).thenReturn(txManager); when(serverRegionProxy.commit(anyInt())).thenThrow(new InternalGemFireError()); doNothing().when(cancelCriterion).checkCancelInProgress(null); doNothing().when(txManager).setTXState(null); ClientTXStateStub stub = spy(new ClientTXStateStub(cache, dm, stateProxy, target, region)); InOrder order = inOrder(serverRegionProxy, internalPool); assertThatThrownBy(() -> stub.commit()).isInstanceOf(InternalGemFireError.class); order.verify(serverRegionProxy).commit(anyInt()); order.verify(internalPool).releaseServerAffinity(); } }
@Test public void commitReleasesServerAffinityAfterCommit() { TXCommitMessage txCommitMessage = mock(TXCommitMessage.class); TXManagerImpl txManager = mock(TXManagerImpl.class); when(cache.getTxManager()).thenReturn(txManager); when(serverRegionProxy.commit(anyInt())).thenReturn(txCommitMessage); doNothing().when(cancelCriterion).checkCancelInProgress(null); doNothing().when(txManager).setTXState(null); ClientTXStateStub stub = spy(new ClientTXStateStub(cache, dm, stateProxy, target, region)); InOrder order = inOrder(serverRegionProxy, internalPool, cancelCriterion); stub.commit(); order.verify(serverRegionProxy).commit(anyInt()); order.verify(internalPool).releaseServerAffinity(); order.verify(cancelCriterion).checkCancelInProgress(null); }
@Override public void beforeCompletion() { obtainLocalLocks(); try { this.firstProxy.beforeCompletion(proxy.getTxId().getUniqId()); } catch (GemFireException e) { this.lockReq.releaseLocal(); this.firstProxy.getPool().releaseServerAffinity(); throw e; } }
@Override public void commit() throws CommitConflictException { obtainLocalLocks(); try { TXCommitMessage txcm = null; try { txcm = firstProxy.commit(proxy.getTxId().getUniqId()); } finally { this.firstProxy.getPool().releaseServerAffinity(); } afterServerCommit(txcm); } catch (TransactionDataNodeHasDepartedException e) { throw new TransactionInDoubtException(e); } finally { lockReq.releaseLocal(); } }