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]