This is an automated email from the ASF dual-hosted git repository.

jbertram pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/activemq-artemis.git


The following commit(s) were added to refs/heads/main by this push:
     new 114302a093 ARTEMIS-4125 address can be removed inadvertently
114302a093 is described below

commit 114302a09387c14a890d17d5b2735640dae09564
Author: Justin Bertram <[email protected]>
AuthorDate: Fri Jan 6 17:25:06 2023 -0600

    ARTEMIS-4125 address can be removed inadvertently
    
    When the last non-durable subscriber on a JMS topic disconnects the
    corresponding queue representing the subscription is deleted as
    expected. However, the queue's address will also be deleted no matter
    what, which is *not* expected.
---
 .../core/server/impl/ServerSessionImpl.java        | 17 +++++------
 .../client/AutoDeleteJmsDestinationTest.java       | 34 ++++++++++++++++++++++
 .../integration/client/TemporaryQueueTest.java     | 16 ++++++++++
 3 files changed, 58 insertions(+), 9 deletions(-)

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 ab77a89f61..1128cd8a20 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
@@ -1126,16 +1126,15 @@ public class ServerSessionImpl implements 
ServerSession, FailureListener {
 
       private void run() {
          try {
+            Binding binding = server.getPostOffice().getBinding(bindingName);
+            if (binding == null) {
+               // the queue may have already been deleted
+               return;
+            }
             logger.debug("deleting temporary queue {}", bindingName);
-
-            try {
-               server.destroyQueue(bindingName, null, false, false, true);
-               if (observer != null) {
-                  observer.tempQueueDeleted(bindingName);
-               }
-            } catch (ActiveMQException e) {
-               // that's fine.. it can happen due to queue already been deleted
-               logger.debug(e.getMessage(), e);
+            server.destroyQueue(bindingName, null, false, false, 
server.getAddressInfo(binding.getAddress()).isTemporary());
+            if (observer != null) {
+               observer.tempQueueDeleted(bindingName);
             }
          } catch (Exception e) {
             ActiveMQServerLogger.LOGGER.errorRemovingTempQueue(bindingName, e);
diff --git 
a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/AutoDeleteJmsDestinationTest.java
 
b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/AutoDeleteJmsDestinationTest.java
index f05a3dc963..7c55b2d592 100644
--- 
a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/AutoDeleteJmsDestinationTest.java
+++ 
b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/AutoDeleteJmsDestinationTest.java
@@ -22,6 +22,7 @@ import javax.jms.MessageConsumer;
 import javax.jms.MessageProducer;
 import javax.jms.Session;
 import javax.jms.TextMessage;
+import javax.jms.Topic;
 
 import org.apache.activemq.artemis.api.core.SimpleString;
 import org.apache.activemq.artemis.api.jms.ActiveMQJMSClient;
@@ -185,6 +186,39 @@ public class AutoDeleteJmsDestinationTest extends 
JMSTestBase {
       assertNull(server.getManagementService().getResource("jtest"));
    }
 
+   @Test
+   public void testAutoDeleteTopicNegative() throws Exception {
+      final int numMessages = 100;
+      final SimpleString addressName = new SimpleString("test");
+      server.getAddressSettingsRepository().addMatch(addressName.toString(), 
new AddressSettings().setAutoDeleteAddresses(false));
+
+      Connection connection = cf.createConnection();
+      Session session = connection.createSession(false, 
Session.AUTO_ACKNOWLEDGE);
+      Topic topic = session.createTopic(addressName.toString());
+      MessageConsumer messageConsumer = session.createConsumer(topic);
+      MessageProducer producer = session.createProducer(topic);
+
+      for (int i = 0; i < numMessages; i++) {
+         TextMessage mess = session.createTextMessage("msg" + i);
+         producer.send(mess);
+      }
+
+      producer.close();
+      // ensure the address was created
+      assertNotNull(server.getAddressInfo(addressName));
+
+      connection.start();
+
+      for (int i = 0; i < numMessages; i++) {
+         Message m = messageConsumer.receive(5000);
+         Assert.assertNotNull(m);
+      }
+
+      connection.close();
+      // ensure the topic was not removed
+      assertFalse(Wait.waitFor(() -> server.getAddressInfo(addressName) == 
null, 2000, 100));
+   }
+
    @Test
    public void testAutoDeleteTopicDurableSubscriber() throws Exception {
       Connection connection = cf.createConnection();
diff --git 
a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/TemporaryQueueTest.java
 
b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/TemporaryQueueTest.java
index 1037230d52..b77269a57e 100644
--- 
a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/TemporaryQueueTest.java
+++ 
b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/TemporaryQueueTest.java
@@ -45,6 +45,7 @@ import 
org.apache.activemq.artemis.core.protocol.core.impl.RemotingConnectionImp
 import org.apache.activemq.artemis.core.remoting.CloseListener;
 import org.apache.activemq.artemis.core.server.ActiveMQServer;
 import org.apache.activemq.artemis.core.server.ServerSession;
+import org.apache.activemq.artemis.core.server.impl.AddressInfo;
 import org.apache.activemq.artemis.core.server.impl.ServerSessionImpl;
 import org.apache.activemq.artemis.core.settings.impl.AddressFullMessagePolicy;
 import org.apache.activemq.artemis.core.settings.impl.AddressSettings;
@@ -198,6 +199,21 @@ public class TemporaryQueueTest extends 
SingleServerTestBase {
       session.close();
    }
 
+   @Test
+   public void testPreserveNonTemporaryAddressAfterConnectionIsClosed() throws 
Exception {
+      SimpleString queue = RandomUtil.randomSimpleString();
+      SimpleString address = RandomUtil.randomSimpleString();
+      server.getAddressSettingsRepository().addMatch(address.toString(), new 
AddressSettings().setAutoDeleteAddresses(false));
+
+      server.addAddressInfo(new 
AddressInfo(address).setTemporary(false).setAutoCreated(true));
+      session.createQueue(new 
QueueConfiguration(queue).setAddress(address).setDurable(false).setTemporary(true));
+      assertNotNull(server.getAddressInfo(address));
+      session.close();
+      sf.close();
+      Wait.assertTrue(() -> server.locateQueue(queue) == null, 2000, 100);
+      assertFalse(Wait.waitFor(() -> server.getAddressInfo(address) == null, 
2000, 100));
+   }
+
    @Test
    public void testQueueWithWildcard() throws Exception {
       session.createQueue(new QueueConfiguration("queue1").setAddress("a.b"));

Reply via email to