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 2015/02/13 00:27:54 UTC

qpid-jms git commit: Fix edge case that can cause a hang and provide a test to cover it.

Repository: qpid-jms
Updated Branches:
  refs/heads/master 9e21b1db3 -> 8238d4620


Fix edge case that can cause a hang and provide a test to cover it. 

Project: http://git-wip-us.apache.org/repos/asf/qpid-jms/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-jms/commit/8238d462
Tree: http://git-wip-us.apache.org/repos/asf/qpid-jms/tree/8238d462
Diff: http://git-wip-us.apache.org/repos/asf/qpid-jms/diff/8238d462

Branch: refs/heads/master
Commit: 8238d46205d360878eca09e0be19e98cdf6b5eb9
Parents: 9e21b1d
Author: Timothy Bish <ta...@gmail.com>
Authored: Thu Feb 12 18:27:48 2015 -0500
Committer: Timothy Bish <ta...@gmail.com>
Committed: Thu Feb 12 18:27:48 2015 -0500

----------------------------------------------------------------------
 .../jms/provider/failover/FailoverProvider.java | 23 +++++++++++++-------
 .../FailoverProviderOfflineBehaviorTest.java    | 13 +++++++++++
 .../qpid/jms/provider/mock/MockProvider.java    |  8 +++++++
 .../qpid/jms/provider/mock/MockRemotePeer.java  |  7 ++++++
 4 files changed, 43 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/8238d462/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 c89ef32..d1ee92f 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
@@ -890,12 +890,7 @@ public class FailoverProvider extends DefaultProviderListener implements Provide
         public void run() {
             requests.put(id, this);
             if (provider == null) {
-                if (failureWhenOffline()) {
-                    requests.remove(id);
-                    getWrappedRequest().onFailure(new IOException("Provider disconnected"));
-                } else if (succeedsWhenOffline()) {
-                    onSuccess();
-                }
+                whenOffline(IOExceptionSupport.create(new IOException("Connection failed.")));
             } else {
                 try {
                     LOG.debug("Executing Failover Task: {}", this);
@@ -907,8 +902,9 @@ public class FailoverProvider extends DefaultProviderListener implements Provide
                     requests.remove(id);
                     getWrappedRequest().onFailure(jmsEx);
                 } catch (Throwable e) {
-                    LOG.debug("Caught exception while executing task: {}", e.getMessage());
-                    triggerReconnectionAttempt();
+                    LOG.debug("Caught exception while executing task: {} - {}", this, e.getMessage());
+                    whenOffline(IOExceptionSupport.create(e));
+                    handleProviderFailure(IOExceptionSupport.create(e));
                 }
             }
         }
@@ -959,6 +955,17 @@ public class FailoverProvider extends DefaultProviderListener implements Provide
         public boolean failureWhenOffline() {
             return false;
         }
+
+        private void whenOffline(IOException error) {
+            if (failureWhenOffline()) {
+                requests.remove(id);
+                getWrappedRequest().onFailure(IOExceptionSupport.create(error));
+            } else if (succeedsWhenOffline()) {
+                onSuccess();
+            } else {
+                LOG.trace("Task {} held until connection recovered:", this);
+            }
+        }
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/8238d462/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/failover/FailoverProviderOfflineBehaviorTest.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/failover/FailoverProviderOfflineBehaviorTest.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/failover/FailoverProviderOfflineBehaviorTest.java
index 3b15b8c..f60a9ba 100644
--- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/failover/FailoverProviderOfflineBehaviorTest.java
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/failover/FailoverProviderOfflineBehaviorTest.java
@@ -142,6 +142,19 @@ public class FailoverProviderOfflineBehaviorTest extends FailoverProviderTestSup
     }
 
     @Test(timeout=10000)
+    public void testSessionCloseWhenProviderSuddenlyClosesDoesNotBlock() throws Exception {
+        connection = (JmsConnection) factory.createConnection();
+        connection.addConnectionListener(new ConnectionInterruptionListener());
+        connection.start();
+
+        Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
+
+        mockPeer.silentlyCloseConnectedProviders();
+
+        session.close();
+    }
+
+    @Test(timeout=10000)
     public void testSessionCloseWithOpenResourcesDoesNotBlock() throws Exception {
         connection = (JmsConnection) factory.createConnection();
         connection.addConnectionListener(new ConnectionInterruptionListener());

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/8238d462/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/mock/MockProvider.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/mock/MockProvider.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/mock/MockProvider.java
index ace5703..46a414f 100644
--- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/mock/MockProvider.java
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/mock/MockProvider.java
@@ -421,6 +421,14 @@ public class MockProvider implements Provider {
         });
     }
 
+
+    /**
+     * Switch state to closed without sending any notifications
+     */
+    public void silentlyClose() {
+        close();
+    }
+
     //----- Property getters and setters -------------------------------------//
 
     @Override

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/8238d462/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/mock/MockRemotePeer.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/mock/MockRemotePeer.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/mock/MockRemotePeer.java
index df8bdb7..12a4de0 100644
--- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/mock/MockRemotePeer.java
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/mock/MockRemotePeer.java
@@ -112,6 +112,13 @@ public class MockRemotePeer {
         MockRemotePeer.INSTANCE = null;
     }
 
+    public void silentlyCloseConnectedProviders() {
+        List<MockProvider> active = new ArrayList<MockProvider>(activeProviders.values());
+        for (MockProvider provider : active) {
+            provider.silentlyClose();
+        }
+    }
+
     public MockProvider getProvider(String providerId) {
         return activeProviders.get(providerId);
     }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org