Repository: qpid-jms
Updated Branches:
  refs/heads/master 2da24883d -> 26ec26863


QPIDJMS-438 Ensure that closed sessions are removed from tracking

When a session is remotely closed it can be left in the Connection
tracking map which can lead to large leaks of remotely closed sessions
over time.  Ensure it is removed on shutdown calls.

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

Branch: refs/heads/master
Commit: 26ec26863410ddf11097054987764b93567a4663
Parents: 2da2488
Author: Timothy Bish <[email protected]>
Authored: Wed Dec 12 12:32:17 2018 -0500
Committer: Timothy Bish <[email protected]>
Committed: Wed Dec 12 12:32:56 2018 -0500

----------------------------------------------------------------------
 .../java/org/apache/qpid/jms/JmsSession.java    | 49 +++++++++++---------
 1 file changed, 26 insertions(+), 23 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/26ec2686/qpid-jms-client/src/main/java/org/apache/qpid/jms/JmsSession.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/main/java/org/apache/qpid/jms/JmsSession.java 
b/qpid-jms-client/src/main/java/org/apache/qpid/jms/JmsSession.java
index 0970a6d..ea70544 100644
--- a/qpid-jms-client/src/main/java/org/apache/qpid/jms/JmsSession.java
+++ b/qpid-jms-client/src/main/java/org/apache/qpid/jms/JmsSession.java
@@ -305,7 +305,6 @@ public class JmsSession implements AutoCloseable, Session, 
QueueSession, TopicSe
             connection.destroyResource(sessionInfo);
         } catch (JmsConnectionFailedException jmsex) {
         }
-        connection.removeSession(sessionInfo);
         if (interrupted) {
             Thread.currentThread().interrupt();
         }
@@ -328,34 +327,38 @@ public class JmsSession implements AutoCloseable, 
Session, QueueSession, TopicSe
 
     protected void shutdown(Throwable cause) throws JMSException {
         if (closed.compareAndSet(false, true)) {
-            sessionInfo.setState(ResourceState.CLOSED);
-            setFailureCause(cause);
-            stop();
+            try {
+                sessionInfo.setState(ResourceState.CLOSED);
+                setFailureCause(cause);
+                stop();
 
-            for (JmsMessageConsumer consumer : new 
ArrayList<JmsMessageConsumer>(this.consumers.values())) {
-                consumer.shutdown(cause);
-            }
+                for (JmsMessageConsumer consumer : new 
ArrayList<JmsMessageConsumer>(this.consumers.values())) {
+                    consumer.shutdown(cause);
+                }
 
-            for (JmsMessageProducer producer : new 
ArrayList<JmsMessageProducer>(this.producers.values())) {
-                producer.shutdown(cause);
-            }
+                for (JmsMessageProducer producer : new 
ArrayList<JmsMessageProducer>(this.producers.values())) {
+                    producer.shutdown(cause);
+                }
 
-            transactionContext.shutdown();
+                transactionContext.shutdown();
 
-            // Ensure that no asynchronous completion sends remain blocked 
after close.
-            synchronized (sessionInfo) {
-                if (cause == null) {
-                    cause = new JMSException("Session closed remotely before 
message transfer result was notified");
-                }
+                // Ensure that no asynchronous completion sends remain blocked 
after close.
+                synchronized (sessionInfo) {
+                    if (cause == null) {
+                        cause = new JMSException("Session closed remotely 
before message transfer result was notified");
+                    }
 
-                getCompletionExecutor().execute(new 
FailOrCompleteAsyncCompletionsTask(JmsExceptionSupport.create(cause)));
-                getCompletionExecutor().shutdown();
-            }
+                    getCompletionExecutor().execute(new 
FailOrCompleteAsyncCompletionsTask(JmsExceptionSupport.create(cause)));
+                    getCompletionExecutor().shutdown();
+                }
 
-            try {
-                
getCompletionExecutor().awaitTermination(connection.getCloseTimeout(), 
TimeUnit.MILLISECONDS);
-            } catch (InterruptedException e) {
-                LOG.trace("Session close awaiting send completions was 
interrupted");
+                try {
+                    
getCompletionExecutor().awaitTermination(connection.getCloseTimeout(), 
TimeUnit.MILLISECONDS);
+                } catch (InterruptedException e) {
+                    LOG.trace("Session close awaiting send completions was 
interrupted");
+                }
+            } finally {
+                connection.removeSession(sessionInfo);
             }
         }
     }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to