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