@Override public Object executeOn(ServerLocation p_server, Op op, boolean accessed, boolean onlyUseExistingCnx) { ServerLocation server = p_server; if (this.serverAffinity.get()) { ServerLocation affinityserver = this.affinityServerLocation.get(); if (affinityserver != null) { server = affinityserver; } else { this.affinityServerLocation.set(server); } // redirect to executeWithServerAffinity so that we // can send a TXFailoverOp. return executeWithServerAffinity(server, op); } return executeOnServer(server, op, accessed, onlyUseExistingCnx); }
@Test public void executeWithServerAffinityWithNonZeroAffinityRetryCountWillNotSetToZero() { OpExecutorImpl opExecutor = new OpExecutorImpl(manager, queueManager, endpointManager, riTracker, -1, 10, true, cancelCriterion, mock(PoolImpl.class)); Op txSynchronizationOp = mock(TXSynchronizationOp.Impl.class); ServerLocation serverLocation = mock(ServerLocation.class); opExecutor.setAffinityRetryCount(1); opExecutor.executeWithServerAffinity(serverLocation, txSynchronizationOp); assertNotEquals(0, opExecutor.getAffinityRetryCount()); }
@Test public void executeWithServerAffinityDoesNotChangeInitialRetryCountOfZero() { OpExecutorImpl opExecutor = new OpExecutorImpl(manager, queueManager, endpointManager, riTracker, -1, 10, true, cancelCriterion, mock(PoolImpl.class)); Op txSynchronizationOp = mock(TXSynchronizationOp.Impl.class); ServerLocation serverLocation = mock(ServerLocation.class); opExecutor.setAffinityRetryCount(0); opExecutor.executeWithServerAffinity(serverLocation, txSynchronizationOp); assertEquals(0, opExecutor.getAffinityRetryCount()); }
@Test public void executeWithServerAffinityAndRetryCountGreaterThansTxRetryAttemptThrowsServerConnectivityException() { OpExecutorImpl opExecutor = spy(new OpExecutorImpl(manager, queueManager, endpointManager, riTracker, -1, 10, true, cancelCriterion, mock(PoolImpl.class))); Op txSynchronizationOp = mock(TXSynchronizationOp.Impl.class); ServerLocation serverLocation = mock(ServerLocation.class); ServerConnectivityException serverConnectivityException = new ServerConnectivityException(); doThrow(serverConnectivityException).when(opExecutor).executeOnServer(serverLocation, txSynchronizationOp, true, false); opExecutor.setupServerAffinity(true); when(((AbstractOp) txSynchronizationOp).getMessage()).thenReturn(mock(Message.class)); opExecutor.setAffinityRetryCount(opExecutor.TX_RETRY_ATTEMPT + 1); assertThatThrownBy( () -> opExecutor.executeWithServerAffinity(serverLocation, txSynchronizationOp)) .isSameAs(serverConnectivityException); }
@Test public void executeWithServerAffinityWithServerConnectivityExceptionIncrementsRetryCountAndResetsToZero() { OpExecutorImpl opExecutor = spy(new OpExecutorImpl(manager, queueManager, endpointManager, riTracker, -1, 10, true, cancelCriterion, mock(PoolImpl.class))); Op txSynchronizationOp = mock(TXSynchronizationOp.Impl.class); ServerLocation serverLocation = mock(ServerLocation.class); ServerConnectivityException serverConnectivityException = new ServerConnectivityException(); doThrow(serverConnectivityException).when(opExecutor).executeOnServer(serverLocation, txSynchronizationOp, true, false); opExecutor.setupServerAffinity(true); when(((AbstractOp) txSynchronizationOp).getMessage()).thenReturn(mock(Message.class)); opExecutor.setAffinityRetryCount(0); opExecutor.executeWithServerAffinity(serverLocation, txSynchronizationOp); verify(opExecutor, times(1)).setAffinityRetryCount(1); assertEquals(0, opExecutor.getAffinityRetryCount()); }
return executeWithServerAffinity(loc, op);