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 2020/03/06 02:36:43 UTC

[activemq-artemis] branch master updated: ARTEMIS-2631 address orphaned from JMS temp queue

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 339cccc  ARTEMIS-2631 address orphaned from JMS temp queue
     new e899fac  This closes #2993
339cccc is described below

commit 339ccccbd71026a0be007526b5d551e1b9e31255
Author: Justin Bertram <jb...@apache.org>
AuthorDate: Mon Feb 24 12:37:26 2020 -0600

    ARTEMIS-2631 address orphaned from JMS temp queue
---
 .../core/postoffice/impl/SimpleAddressManager.java |  2 +-
 .../core/server/impl/ActiveMQServerImpl.java       |  7 +++--
 .../artemis/core/server/impl/AddressInfo.java      | 11 +++++++
 .../jms/client/TemporaryDestinationTest.java       | 36 ++++++++++++++++++++++
 4 files changed, 52 insertions(+), 4 deletions(-)

diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/SimpleAddressManager.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/SimpleAddressManager.java
index 24904e2..206891e 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/SimpleAddressManager.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/SimpleAddressManager.java
@@ -269,7 +269,7 @@ public class SimpleAddressManager implements AddressManager {
    @Override
    public boolean addAddressInfo(AddressInfo addressInfo) throws Exception {
       boolean added = reloadAddressInfo(addressInfo);
-      if (added && storageManager != null) {
+      if (!addressInfo.isTemporary() && added && storageManager != null) {
          long txID = storageManager.generateID();
          try {
             storageManager.addAddressBinding(txID, addressInfo);
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java
index 4cea428..f7a6fc9 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java
@@ -3382,9 +3382,10 @@ public class ActiveMQServerImpl implements ActiveMQServer {
       RoutingType rt = (routingType == null ? ActiveMQDefaultConfiguration.getDefaultRoutingType() : routingType);
       if (autoCreateAddress || temporary) {
          if (info == null) {
-            final AddressInfo addressInfo = new AddressInfo(addressToUse, rt);
-            addressInfo.setAutoCreated(true);
-            addressInfo.setInternal(addrInfo == null ? false : addrInfo.isInternal());
+            final AddressInfo addressInfo = new AddressInfo(addressToUse, rt)
+               .setAutoCreated(true)
+               .setTemporary(temporary)
+               .setInternal(addrInfo == null ? false : addrInfo.isInternal());
             addAddressInfo(addressInfo);
          } else if (!info.getRoutingTypes().contains(rt)) {
             EnumSet<RoutingType> routingTypes = EnumSet.copyOf(info.getRoutingTypes());
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/AddressInfo.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/AddressInfo.java
index 81eefdb..b3ec9cb 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/AddressInfo.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/AddressInfo.java
@@ -46,6 +46,8 @@ public class AddressInfo {
 
    private boolean autoCreated = false;
 
+   private volatile boolean temporary = false;
+
    private static final EnumSet<RoutingType> EMPTY_ROUTING_TYPES = EnumSet.noneOf(RoutingType.class);
    private EnumSet<RoutingType> routingTypes;
    private RoutingType firstSeen;
@@ -101,6 +103,15 @@ public class AddressInfo {
       return this;
    }
 
+   public boolean isTemporary() {
+      return temporary;
+   }
+
+   public AddressInfo setTemporary(boolean temporary) {
+      this.temporary = temporary;
+      return this;
+   }
+
    public SimpleString getName() {
       return name;
    }
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 850359a..030abfe 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
@@ -47,6 +47,11 @@ public class TemporaryDestinationTest extends JMSTestBase {
       super.setUp();
    }
 
+   @Override
+   protected boolean usePersistence() {
+      return true;
+   }
+
    @Test
    public void testTemporaryQueueLeak() throws Exception {
       ActiveMQConnection conn = null;
@@ -214,6 +219,37 @@ public class TemporaryDestinationTest extends JMSTestBase {
    }
 
    @Test
+   public void testTemporaryResourcesDeletedAfterServerRestart() throws Exception {
+      server.getAddressSettingsRepository().addMatch("#", new AddressSettings().setAutoCreateAddresses(false).setAutoCreateQueues(false));
+
+      Connection conn = null;
+
+      try {
+         conn = createConnection();
+
+         Session producerSession = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
+
+         TemporaryQueue tempQueue = producerSession.createTemporaryQueue();
+
+         assertNotNull(server.getAddressInfo(SimpleString.toSimpleString(tempQueue.getQueueName())));
+
+         server.stop();
+
+         conn.close();
+
+         server.start();
+
+         waitForServerToStart(server);
+
+         assertNull(server.getAddressInfo(SimpleString.toSimpleString(tempQueue.getQueueName())));
+      } finally {
+         if (conn != null) {
+            conn.close();
+         }
+      }
+   }
+
+   @Test
    public void testForTempQueueCleanerUpperLeak() throws Exception {
       try {
          conn = createConnection();