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 2024/03/07 15:45:46 UTC

(activemq-artemis) branch main updated: ARTEMIS-4664 - autoCreatedResource can get removed while receiving batch of messages

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

clebertsuconic 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 45533c38da ARTEMIS-4664 - autoCreatedResource can get removed while receiving batch of messages
45533c38da is described below

commit 45533c38da7b160733f5c48e3f313b3175b14dd9
Author: AntonRoskvist <an...@volvo.com>
AuthorDate: Thu Mar 7 11:36:08 2024 +0100

    ARTEMIS-4664 - autoCreatedResource can get removed while receiving batch of messages
---
 .../core/server/impl/ActiveMQServerImpl.java       |  3 ++
 .../server/AutoCreateDeadLetterResourcesTest.java  | 37 ++++++++++++++++++++++
 2 files changed, 40 insertions(+)

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 5886d5637e..20cace6b67 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
@@ -4090,6 +4090,9 @@ public class ActiveMQServerImpl implements ActiveMQServer {
             }
             final QueueBinding queueBinding = (QueueBinding) rawBinding;
             if (ignoreIfExists) {
+               //Reset potentially ongoing auto-delete status of queue
+               queueBinding.getQueue().setSwept(false);
+
                return queueBinding.getQueue();
             } else {
                throw ActiveMQMessageBundle.BUNDLE.queueAlreadyExists(queueConfiguration.getName(), queueBinding.getAddress());
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/server/AutoCreateDeadLetterResourcesTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/server/AutoCreateDeadLetterResourcesTest.java
index 6a29677578..c02ba3d524 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/server/AutoCreateDeadLetterResourcesTest.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/server/AutoCreateDeadLetterResourcesTest.java
@@ -27,6 +27,8 @@ import org.apache.activemq.artemis.api.core.client.ClientProducer;
 import org.apache.activemq.artemis.api.core.client.ClientSession;
 import org.apache.activemq.artemis.api.core.client.ClientSessionFactory;
 import org.apache.activemq.artemis.api.core.client.ServerLocator;
+import org.apache.activemq.artemis.api.core.management.QueueControl;
+import org.apache.activemq.artemis.api.core.management.ResourceNames;
 import org.apache.activemq.artemis.core.config.DivertConfiguration;
 import org.apache.activemq.artemis.core.server.ActiveMQServer;
 import org.apache.activemq.artemis.core.server.Queue;
@@ -256,6 +258,41 @@ public class AutoCreateDeadLetterResourcesTest extends ActiveMQTestBase {
       message.acknowledge();
    }
 
+   @Test
+   public void testOngingSendToDLAPreventAutoDelete() throws Exception {
+      final int messageCount = 100;
+      SimpleString dlqName = AddressSettings.DEFAULT_DEAD_LETTER_QUEUE_PREFIX.concat(addressA).concat(AddressSettings.DEFAULT_DEAD_LETTER_QUEUE_SUFFIX);
+
+      server.createQueue(new QueueConfiguration(queueA).setAddress(addressA).setRoutingType(RoutingType.ANYCAST));
+
+      ServerLocator locator = createInVMNonHALocator();
+      ClientSessionFactory sessionFactory = createSessionFactory(locator);
+      ClientSession session = addClientSession(sessionFactory.createSession(true, true));
+      ClientProducer producer = addClientProducer(session.createProducer(addressA));
+
+      ClientMessage message = session.createMessage(true);
+      message.getBodyBuffer().writeBytes(createFakeLargeStream(1024 * 1024).readAllBytes());
+
+      for (int i = 0; i < messageCount; i++) {
+         producer.send(message);
+      }
+
+      QueueControl queueControl = (QueueControl)server.getManagementService().getResource(ResourceNames.QUEUE + queueA);
+      queueControl.sendMessagesToDeadLetterAddress(null);
+
+      QueueControl dlqControl = (QueueControl)server.getManagementService().getResource(ResourceNames.QUEUE + dlqName);
+      dlqControl.retryMessages();
+
+      for (int i = 0; i < 10; i++) {
+         queueControl.sendMessagesToDeadLetterAddress(null);
+         dlqControl.retryMessages();
+      }
+
+      Wait.assertTrue(() -> queueControl.getMessageCount() == messageCount, 2000);
+      Wait.assertTrue(() -> server.locateQueue(dlqName) == null, 2000);
+
+   }
+
    private void triggerDlaDelivery() throws Exception {
       try {
          server.createQueue(new QueueConfiguration(queueA).setAddress(addressA).setRoutingType(RoutingType.ANYCAST));