You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ta...@apache.org on 2018/03/20 22:15:35 UTC

qpid-jms git commit: QPIDJMS-366 Ensure failover honoers maxReconnectAttempts

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 <ta...@gmail.com>
Authored: Tue Mar 20 18:15:08 2018 -0400
Committer: Timothy Bish <ta...@gmail.com>
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: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org