Repository: qpid-jms Updated Branches: refs/heads/master 3e8061b44 -> 054e24c58
QPIDJMS-366 Ensure failover honoers maxReconnectAttempts Fix case when stuck in repeating remote close cycle the failover transport can ignore the max reconnect limit Project: http://git-wip-us.apache.org/repos/asf/qpid-jms/repo Commit: http://git-wip-us.apache.org/repos/asf/qpid-jms/commit/054e24c5 Tree: http://git-wip-us.apache.org/repos/asf/qpid-jms/tree/054e24c5 Diff: http://git-wip-us.apache.org/repos/asf/qpid-jms/diff/054e24c5 Branch: refs/heads/master Commit: 054e24c5836ffda370e711d2c89b6f35853be939 Parents: 3e8061b Author: Timothy Bish <[email protected]> Authored: Tue Mar 20 18:15:08 2018 -0400 Committer: Timothy Bish <[email protected]> Committed: Tue Mar 20 18:15:08 2018 -0400 ---------------------------------------------------------------------- .../jms/provider/failover/FailoverProvider.java | 2 +- .../failover/FailoverIntegrationTest.java | 73 ++++++++++++++++++++ .../qpid/jms/test/testpeer/TestAmqpPeer.java | 6 ++ 3 files changed, 80 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/054e24c5/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/failover/FailoverProvider.java ---------------------------------------------------------------------- diff --git a/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/failover/FailoverProvider.java b/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/failover/FailoverProvider.java index 62c0419..d8a1497 100644 --- a/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/failover/FailoverProvider.java +++ b/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/failover/FailoverProvider.java @@ -1326,7 +1326,7 @@ public class FailoverProvider extends DefaultProviderListener implements Provide return false; } - return reconnectAttemptLimit() != 0; + return !isLimitExceeded(); } private int reconnectAttemptLimit() { http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/054e24c5/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/failover/FailoverIntegrationTest.java ---------------------------------------------------------------------- diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/failover/FailoverIntegrationTest.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/failover/FailoverIntegrationTest.java index b2f402e..defbc2f 100644 --- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/failover/FailoverIntegrationTest.java +++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/failover/FailoverIntegrationTest.java @@ -1637,6 +1637,79 @@ public class FailoverIntegrationTest extends QpidJmsTestCase { } } + @Test(timeout = 20000) + public void testDropAndRejectAfterwardsHonorsMax() throws Exception { + try (TestAmqpPeer firstPeer = new TestAmqpPeer(); + TestAmqpPeer secondPeer = new TestAmqpPeer(); + TestAmqpPeer thirdPeer = new TestAmqpPeer(); + TestAmqpPeer fourthPeer = new TestAmqpPeer()) { + + final CountDownLatch testConnected = new CountDownLatch(1); + final CountDownLatch failedConnection = new CountDownLatch(1); + + // Create a peer to connect to, then one to reconnect to + final String testPeerURI = createPeerURI(firstPeer); + + LOG.info("First peer is at: {}", firstPeer); + LOG.info("Second peer is at: {}", secondPeer); + LOG.info("Third peer is at: {}", thirdPeer); + LOG.info("Fourth peer is at: {}", fourthPeer); + + firstPeer.expectSaslAnonymous(); + firstPeer.expectOpen(); + firstPeer.expectBegin(); + firstPeer.remotelyCloseConnection(true, ConnectionError.CONNECTION_FORCED, "Server is going away", 100); + + secondPeer.rejectConnect(AmqpError.NOT_FOUND, "Resource could not be located", null); + thirdPeer.rejectConnect(AmqpError.NOT_FOUND, "Resource could not be located", null); + + // This shouldn't get hit, but if it does accept the connect so we don't pass the failed + // to connect assertion. + fourthPeer.expectSaslAnonymous(); + fourthPeer.expectOpen(); + fourthPeer.expectBegin(); + fourthPeer.expectClose(); + + final JmsConnection connection = establishAnonymousConnecton( + "failover.maxReconnectAttempts=2&failover.useReconnectBackOff=false", firstPeer, secondPeer, thirdPeer, fourthPeer); + connection.addConnectionListener(new JmsDefaultConnectionListener() { + @Override + public void onConnectionEstablished(URI remoteURI) { + LOG.info("Connection Established: {}", remoteURI); + if (testPeerURI.equals(remoteURI.toString())) { + testConnected.countDown(); + } + } + + @Override + public void onConnectionFailure(Throwable cause) { + LOG.info("Connection Failed: {}", cause); + failedConnection.countDown(); + } + }); + connection.start(); + + assertTrue("Should connect to test peer", testConnected.await(5, TimeUnit.SECONDS)); + + // --- Failover should handle the connection close ---------------// + + assertTrue("Should reported failed", failedConnection.await(5, TimeUnit.SECONDS)); + + try { + connection.close(); + } catch (JMSException jmsEx) {} + + secondPeer.waitForAllHandlersToCompleteNoAssert(2000); + thirdPeer.waitForAllHandlersToComplete(2000); + + try { + fourthPeer.purgeExpectations(); + fourthPeer.close(); + fail("Should have not executed any handlers."); + } catch (Throwable t) {} + } + } + private JmsConnection establishAnonymousConnecton(TestAmqpPeer... peers) throws JMSException { return establishAnonymousConnecton(null, null, peers); } http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/054e24c5/qpid-jms-client/src/test/java/org/apache/qpid/jms/test/testpeer/TestAmqpPeer.java ---------------------------------------------------------------------- diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/test/testpeer/TestAmqpPeer.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/test/testpeer/TestAmqpPeer.java index 16e532a..8eae69b 100644 --- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/test/testpeer/TestAmqpPeer.java +++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/test/testpeer/TestAmqpPeer.java @@ -274,6 +274,12 @@ public class TestAmqpPeer implements AutoCloseable return _emptyFrameCount.get(); } + public void purgeExpectations() { + synchronized (_handlersLock) { + _handlers.clear(); + } + } + void receiveHeader(byte[] header) { Handler handler = getFirstHandler(); --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
