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/artemis.git


The following commit(s) were added to refs/heads/main by this push:
     new 310a1ec9bb ARTEMIS-5773 remove dupId cache when address is removed
310a1ec9bb is described below

commit 310a1ec9bbb6ce8f31f1e04f5a851c50dc9c5178
Author: Justin Bertram <[email protected]>
AuthorDate: Thu Dec 18 14:07:11 2025 -0600

    ARTEMIS-5773 remove dupId cache when address is removed
---
 .../core/postoffice/impl/PostOfficeImpl.java       |  3 ++
 .../tests/integration/DuplicateDetectionTest.java  | 48 ++++++++++++++++------
 .../integration/client/AutoDeleteAddressTest.java  | 13 ++++++
 3 files changed, 52 insertions(+), 12 deletions(-)

diff --git 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/PostOfficeImpl.java
 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/PostOfficeImpl.java
index fbe94f4e0c..be46fde8ab 100644
--- 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/PostOfficeImpl.java
+++ 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/PostOfficeImpl.java
@@ -904,6 +904,9 @@ public class PostOfficeImpl implements PostOffice, 
NotificationListener, Binding
          }
 
          removeRetroactiveResources(address);
+
+         deleteDuplicateCache(address);
+
          if (server.hasBrokerAddressPlugins()) {
             server.callBrokerAddressPlugins(plugin -> 
plugin.afterRemoveAddress(address, addressInfo));
          }
diff --git 
a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/DuplicateDetectionTest.java
 
b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/DuplicateDetectionTest.java
index c70028349a..b8e3582ce3 100644
--- 
a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/DuplicateDetectionTest.java
+++ 
b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/DuplicateDetectionTest.java
@@ -34,6 +34,7 @@ import 
org.apache.activemq.artemis.api.core.ActiveMQDuplicateIdException;
 import org.apache.activemq.artemis.api.core.ActiveMQException;
 import org.apache.activemq.artemis.api.core.Message;
 import org.apache.activemq.artemis.api.core.QueueConfiguration;
+import org.apache.activemq.artemis.api.core.RoutingType;
 import org.apache.activemq.artemis.api.core.SimpleString;
 import org.apache.activemq.artemis.api.core.TransportConfiguration;
 import org.apache.activemq.artemis.api.core.client.ActiveMQClient;
@@ -52,6 +53,7 @@ import 
org.apache.activemq.artemis.tests.extensions.parameterized.Parameter;
 import 
org.apache.activemq.artemis.tests.extensions.parameterized.ParameterizedTestExtension;
 import org.apache.activemq.artemis.tests.extensions.parameterized.Parameters;
 import org.apache.activemq.artemis.tests.util.ActiveMQTestBase;
+import org.apache.activemq.artemis.utils.RandomUtil;
 import org.apache.activemq.artemis.utils.UUIDGenerator;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.TestTemplate;
@@ -1346,6 +1348,36 @@ public class DuplicateDetectionTest extends 
ActiveMQTestBase {
       return message;
    }
 
+   @TestTemplate
+   public void testDuplicateCacheCleanupWhenAddressRemoved() throws Exception {
+      final SimpleString addressName = 
SimpleString.of("DuplicateDetectionTestQueue");
+
+      // send a message to create a cache
+      sf = createSessionFactory(locator);
+      ClientSession session = sf.createSession(false, true, true);
+      session.createAddress(addressName, RoutingType.MULTICAST, false);
+      ClientProducer producer = session.createProducer(addressName);
+      ClientMessage message = createMessage(session, 1);
+      message.putBytesProperty(Message.HDR_DUPLICATE_DETECTION_ID, 
RandomUtil.randomBytes(10));
+      producer.send(message);
+      session.close();
+      sf.close();
+
+      assertNotNull(((PostOfficeImpl) 
server.getPostOffice()).getDuplicateIDCaches().get(addressName));
+
+      server.removeAddressInfo(addressName, null);
+
+      assertNull(((PostOfficeImpl) 
server.getPostOffice()).getDuplicateIDCaches().get(addressName));
+
+      server.stop();
+
+      waitForServerToStop(server);
+
+      server.start();
+
+      assertNull(((PostOfficeImpl) 
server.getPostOffice()).getDuplicateIDCaches().get(addressName));
+   }
+
    @TestTemplate
    public void testDuplicateCachePersisted() throws Exception {
       server.stop();
@@ -1364,7 +1396,7 @@ public class DuplicateDetectionTest extends 
ActiveMQTestBase {
 
       final SimpleString queueName = 
SimpleString.of("DuplicateDetectionTestQueue");
 
-      session.createQueue(QueueConfiguration.of(queueName).setDurable(false));
+      session.createQueue(QueueConfiguration.of(queueName).setDurable(true));
 
       ClientProducer producer = session.createProducer(queueName);
 
@@ -1400,8 +1432,6 @@ public class DuplicateDetectionTest extends 
ActiveMQTestBase {
 
       session.start();
 
-      session.createQueue(QueueConfiguration.of(queueName).setDurable(false));
-
       producer = session.createProducer(queueName);
 
       consumer = session.createConsumer(queueName);
@@ -1439,7 +1469,7 @@ public class DuplicateDetectionTest extends 
ActiveMQTestBase {
 
       final SimpleString queueName = 
SimpleString.of("DuplicateDetectionTestQueue");
 
-      session.createQueue(QueueConfiguration.of(queueName).setDurable(false));
+      session.createQueue(QueueConfiguration.of(queueName).setDurable(true));
 
       ClientProducer producer = session.createProducer(queueName);
 
@@ -1470,8 +1500,6 @@ public class DuplicateDetectionTest extends 
ActiveMQTestBase {
 
       session.start();
 
-      session.createQueue(QueueConfiguration.of(queueName).setDurable(false));
-
       producer = session.createProducer(queueName);
 
       consumer = session.createConsumer(queueName);
@@ -1645,7 +1673,7 @@ public class DuplicateDetectionTest extends 
ActiveMQTestBase {
 
       final SimpleString queueName = 
SimpleString.of("DuplicateDetectionTestQueue");
 
-      session.createQueue(QueueConfiguration.of(queueName).setDurable(false));
+      session.createQueue(QueueConfiguration.of(queueName).setDurable(true));
 
       ClientProducer producer = session.createProducer(queueName);
 
@@ -1687,8 +1715,6 @@ public class DuplicateDetectionTest extends 
ActiveMQTestBase {
 
       session.start();
 
-      session.createQueue(QueueConfiguration.of(queueName).setDurable(false));
-
       producer = session.createProducer(queueName);
 
       consumer = session.createConsumer(queueName);
@@ -1906,7 +1932,7 @@ public class DuplicateDetectionTest extends 
ActiveMQTestBase {
 
       final SimpleString queueName = 
SimpleString.of("DuplicateDetectionTestQueue");
 
-      session.createQueue(QueueConfiguration.of(queueName).setDurable(false));
+      session.createQueue(QueueConfiguration.of(queueName).setDurable(true));
 
       ClientProducer producer = session.createProducer(queueName);
 
@@ -1946,8 +1972,6 @@ public class DuplicateDetectionTest extends 
ActiveMQTestBase {
 
       session.start();
 
-      session.createQueue(QueueConfiguration.of(queueName).setDurable(false));
-
       producer = session.createProducer(queueName);
 
       consumer = session.createConsumer(queueName);
diff --git 
a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/AutoDeleteAddressTest.java
 
b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/AutoDeleteAddressTest.java
index c90ecd57da..003ea2bc61 100644
--- 
a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/AutoDeleteAddressTest.java
+++ 
b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/AutoDeleteAddressTest.java
@@ -76,6 +76,19 @@ public class AutoDeleteAddressTest extends ActiveMQTestBase {
       Wait.assertTrue(() -> server.getAddressInfo(addressA) == null);
    }
 
+   @Test
+   public void testDuplicateIdCacheDeletedWithAddress() throws Exception {
+      // auto-delete-addresses defaults to true
+      
server.createQueue(QueueConfiguration.of(queueA).setAddress(addressA).setRoutingType(RoutingType.ANYCAST).setAutoCreated(true));
+      // this will create a duplicate ID cache for this address without 
actually having to send a message with a duplicate ID
+      server.getPostOffice().getDuplicateIDCache(addressA);
+      assertNotNull(((PostOfficeImpl) 
server.getPostOffice()).getDuplicateIDCaches().get(addressA));
+      assertNotNull(server.getAddressInfo(addressA));
+      cf.createSession().createConsumer(queueA).close();
+      PostOfficeTestAccessor.sweepAndReapAddresses((PostOfficeImpl) 
server.getPostOffice());
+      Wait.assertNull(() -> ((PostOfficeImpl) 
server.getPostOffice()).getDuplicateIDCaches().get(addressA), 500, 50);
+   }
+
    @Test
    public void testNegativeAutoDeleteAutoCreatedAddress() throws Exception {
       server.getAddressSettingsRepository().addMatch(addressA.toString(), new 
AddressSettings().setAutoDeleteAddresses(false));


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

Reply via email to