You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by cl...@apache.org on 2019/04/17 14:41:39 UTC
[activemq-artemis] branch master updated: ARTEMIS-2309
TempQueueCleanerUpper instances are leaking
This is an automated email from the ASF dual-hosted git repository.
clebertsuconic pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/activemq-artemis.git
The following commit(s) were added to refs/heads/master by this push:
new e0a7073 ARTEMIS-2309 TempQueueCleanerUpper instances are leaking
new 037d8a5 This closes #2623
e0a7073 is described below
commit e0a7073884c10d0038d28005308b16760dbe3563
Author: Justin Bertram <jb...@apache.org>
AuthorDate: Tue Apr 16 15:24:06 2019 -0500
ARTEMIS-2309 TempQueueCleanerUpper instances are leaking
The changes from ARTEMIS-2189 mean that
o.a.a.a.c.s.i.ServerSessionImpl#deleteQueue
is no longer called from the same ServerSessionImpl instance that
created it which means that TempQueueCleanerUpper instances will leak.
To resolve the leak the client will only create a new session when
necessary instead of every time delete() is invoked.
---
.../artemis/jms/client/ActiveMQDestination.java | 28 +++++++++++++++-------
.../core/server/impl/ServerSessionImpl.java | 4 ++++
.../jms/client/TemporaryDestinationTest.java | 18 ++++++++++++++
3 files changed, 42 insertions(+), 8 deletions(-)
diff --git a/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQDestination.java b/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQDestination.java
index 9bdc486..c0f3cdc 100644
--- a/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQDestination.java
+++ b/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQDestination.java
@@ -421,19 +421,31 @@ public class ActiveMQDestination extends JNDIStorable implements Destination, Se
public void delete() throws JMSException {
if (session != null) {
- /**
- * The status of the session used to create the temporary destination is uncertain, but the JMS spec states
- * that the lifetime of the temporary destination is tied to the connection so even if the originating
- * session is closed the temporary destination should still be deleted. Therefore, just create a new one
- * and close it after the temporary destination is deleted. This is necessary because the Core API is
- * predicated on having a Core ClientSession which is encapsulated by the JMS session implementation.
- */
- try (ActiveMQSession sessionToUse = (ActiveMQSession) session.getConnection().createSession()) {
+ boolean openedHere = false;
+ ActiveMQSession sessionToUse = session;
+
+ if (session.getCoreSession().isClosed()) {
+ sessionToUse = (ActiveMQSession)session.getConnection().createSession();
+ openedHere = true;
+ }
+
+ try {
+ /**
+ * The status of the session used to create the temporary destination is uncertain, but the JMS spec states
+ * that the lifetime of the temporary destination is tied to the connection so even if the originating
+ * session is closed the temporary destination should still be deleted. Therefore, just create a new one
+ * and close it after the temporary destination is deleted. This is necessary because the Core API is
+ * predicated on having a Core ClientSession which is encapsulated by the JMS session implementation.
+ */
if (isQueue()) {
sessionToUse.deleteTemporaryQueue(this);
} else {
sessionToUse.deleteTemporaryTopic(this);
}
+ } finally {
+ if (openedHere) {
+ sessionToUse.close();
+ }
}
}
}
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ServerSessionImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ServerSessionImpl.java
index a97ab66..2f83d35 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ServerSessionImpl.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ServerSessionImpl.java
@@ -291,6 +291,10 @@ public class ServerSessionImpl implements ServerSession, FailureListener {
this.closeables.add(closeable);
}
+ public Map<SimpleString, TempQueueCleanerUpper> getTempQueueCleanUppers() {
+ return tempQueueCleannerUppers;
+ }
+
@Override
public Executor getSessionExecutor() {
return sessionExecutor;
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/jms/client/TemporaryDestinationTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/jms/client/TemporaryDestinationTest.java
index 6f87d52..c08e9c8 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/jms/client/TemporaryDestinationTest.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/jms/client/TemporaryDestinationTest.java
@@ -26,6 +26,8 @@ import javax.jms.TemporaryTopic;
import javax.jms.TextMessage;
import org.apache.activemq.artemis.api.core.SimpleString;
+import org.apache.activemq.artemis.core.server.ServerSession;
+import org.apache.activemq.artemis.core.server.impl.ServerSessionImpl;
import org.apache.activemq.artemis.core.settings.impl.AddressSettings;
import org.apache.activemq.artemis.jms.client.ActiveMQConnection;
import org.apache.activemq.artemis.tests.util.JMSTestBase;
@@ -204,4 +206,20 @@ public class TemporaryDestinationTest extends JMSTestBase {
}
}
+ @Test
+ public void testForTempQueueCleanerUpperLeak() throws Exception {
+ try {
+ conn = createConnection();
+ Session s = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ TemporaryQueue temporaryQueue = s.createTemporaryQueue();
+ temporaryQueue.delete();
+ for (ServerSession serverSession : server.getSessions()) {
+ assertEquals(0, ((ServerSessionImpl)serverSession).getTempQueueCleanUppers().size());
+ }
+ } finally {
+ if (conn != null) {
+ conn.close();
+ }
+ }
+ }
}