This is an automated email from the ASF dual-hosted git repository.
jbertram 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 0b155cf ARTEMIS-2666 mngmnt for duplicate ID cache
new 75a5b75 This closes #3033
0b155cf is described below
commit 0b155cf5eaa64022c1d8e3df678b9ee17453991b
Author: Justin Bertram <[email protected]>
AuthorDate: Wed Mar 18 20:48:34 2020 -0500
ARTEMIS-2666 mngmnt for duplicate ID cache
---
.../apache/activemq/artemis/logs/AuditLogger.java | 17 ++++++++++
.../api/core/management/AddressControl.java | 6 ++++
.../core/management/impl/AddressControlImpl.java | 38 ++++++++++++++++++++++
.../integration/management/AddressControlTest.java | 36 ++++++++++++++++++++
.../management/AddressControlUsingCoreTest.java | 10 ++++++
5 files changed, 107 insertions(+)
diff --git
a/artemis-commons/src/main/java/org/apache/activemq/artemis/logs/AuditLogger.java
b/artemis-commons/src/main/java/org/apache/activemq/artemis/logs/AuditLogger.java
index 28ea864..773c631 100644
---
a/artemis-commons/src/main/java/org/apache/activemq/artemis/logs/AuditLogger.java
+++
b/artemis-commons/src/main/java/org/apache/activemq/artemis/logs/AuditLogger.java
@@ -2324,4 +2324,21 @@ public interface AuditLogger extends BasicLogger {
@LogMessage(level = Logger.Level.INFO)
@Message(id = 601508, value = "User {0} is getting group first key on
target resource: {1} {2}", format = Message.Format.MESSAGE_FORMAT)
void getGroupFirstKey(String user, Object source, Object... args);
+
+ static void getCurrentDuplicateIdCacheSize(Object source) {
+ LOGGER.getCurrentDuplicateIdCacheSize(getCaller(), source);
+ }
+
+ @LogMessage(level = Logger.Level.INFO)
+ @Message(id = 601509, value = "User {0} is getting
currentDuplicateIdCacheSize property on target resource: {1} {2}", format =
Message.Format.MESSAGE_FORMAT)
+ void getCurrentDuplicateIdCacheSize(String user, Object source, Object...
args);
+
+
+ static void clearDuplicateIdCache(Object source) {
+ LOGGER.clearDuplicateIdCache(getCaller(), source);
+ }
+
+ @LogMessage(level = Logger.Level.INFO)
+ @Message(id = 601510, value = "User {0} is clearing duplicate ID cache on
target resource: {1} {2}", format = Message.Format.MESSAGE_FORMAT)
+ void clearDuplicateIdCache(String user, Object source, Object... args);
}
diff --git
a/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/management/AddressControl.java
b/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/management/AddressControl.java
index 0eaf3e1..e367685 100644
---
a/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/management/AddressControl.java
+++
b/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/management/AddressControl.java
@@ -165,4 +165,10 @@ public interface AddressControl {
@Attribute(desc = "whether this address is used for a retroactive address")
boolean isRetroactiveResource();
+ @Attribute(desc = "the size of the duplicate ID cache for this address")
+ long getCurrentDuplicateIdCacheSize();
+
+ @Attribute(desc = "clear the duplicate ID cache for this address both from
memory and from the journal")
+ boolean clearDuplicateIdCache() throws Exception;
+
}
diff --git
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/AddressControlImpl.java
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/AddressControlImpl.java
index 5332c01..c3c0a74 100644
---
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/AddressControlImpl.java
+++
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/AddressControlImpl.java
@@ -35,11 +35,14 @@ import org.apache.activemq.artemis.core.paging.PagingStore;
import org.apache.activemq.artemis.core.persistence.StorageManager;
import org.apache.activemq.artemis.core.postoffice.Binding;
import org.apache.activemq.artemis.core.postoffice.Bindings;
+import org.apache.activemq.artemis.core.postoffice.DuplicateIDCache;
import org.apache.activemq.artemis.core.postoffice.QueueBinding;
+import org.apache.activemq.artemis.core.postoffice.impl.PostOfficeImpl;
import org.apache.activemq.artemis.core.security.CheckType;
import org.apache.activemq.artemis.core.security.Role;
import org.apache.activemq.artemis.core.security.SecurityStore;
import org.apache.activemq.artemis.core.server.ActiveMQServer;
+import org.apache.activemq.artemis.core.server.ActiveMQServerLogger;
import org.apache.activemq.artemis.core.server.impl.AddressInfo;
import org.apache.activemq.artemis.core.server.management.ManagementService;
import org.apache.activemq.artemis.core.settings.HierarchicalRepository;
@@ -427,6 +430,41 @@ public class AddressControlImpl extends AbstractControl
implements AddressContro
return
ResourceNames.isRetroactiveResource(server.getInternalNamingPrefix(),
addressInfo.getName());
}
+ @Override
+ public long getCurrentDuplicateIdCacheSize() {
+ if (AuditLogger.isEnabled()) {
+ AuditLogger.getCurrentDuplicateIdCacheSize(this.addressInfo);
+ }
+ DuplicateIDCache cache =
((PostOfficeImpl)server.getPostOffice()).getDuplicateIDCaches().get(addressInfo.getName());
+ try {
+ if (cache != null) {
+ return cache.getMap().size();
+ }
+ } catch (Exception e) {
+ ActiveMQServerLogger.LOGGER.debug("Failed to get duplicate ID cache
size", e);
+ }
+
+ return 0;
+ }
+
+ @Override
+ public boolean clearDuplicateIdCache() {
+ if (AuditLogger.isEnabled()) {
+ AuditLogger.clearDuplicateIdCache(this.addressInfo);
+ }
+ DuplicateIDCache cache =
((PostOfficeImpl)server.getPostOffice()).getDuplicateIDCaches().get(addressInfo.getName());
+ try {
+ if (cache != null) {
+ cache.clear();
+ return true;
+ }
+ } catch (Exception e) {
+ ActiveMQServerLogger.LOGGER.debug("Failed to clear duplicate ID
cache", e);
+ }
+
+ return false;
+ }
+
// Package protected ---------------------------------------------
// Protected -----------------------------------------------------
diff --git
a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/AddressControlTest.java
b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/AddressControlTest.java
index e23cbe8..d07cc0b 100644
---
a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/AddressControlTest.java
+++
b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/AddressControlTest.java
@@ -24,6 +24,7 @@ import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
+import java.util.UUID;
import org.apache.activemq.artemis.api.core.JsonUtil;
import org.apache.activemq.artemis.api.core.Message;
@@ -432,6 +433,41 @@ public class AddressControlTest extends ManagementTestBase
{
assertEquals("myValue2", message.getStringProperty("myProp2"));
}
+ @Test
+ public void testGetCurrentDuplicateIdCacheSize() throws Exception {
+ internalDuplicateIdTest(false);
+ }
+
+ @Test
+ public void testClearDuplicateIdCache() throws Exception {
+ internalDuplicateIdTest(true);
+ }
+
+ private void internalDuplicateIdTest(boolean clear) throws Exception {
+ server.getConfiguration().setPersistIDCache(false);
+ SimpleString address = RandomUtil.randomSimpleString();
+ session.createAddress(address, RoutingType.ANYCAST, false);
+
+ AddressControl addressControl = createManagementControl(address);
+ Assert.assertEquals(0, addressControl.getQueueNames().length);
+ session.createQueue(address, RoutingType.ANYCAST, address);
+ Assert.assertEquals(1, addressControl.getQueueNames().length);
+ Map<String, String> headers = new HashMap<>();
+ headers.put(Message.HDR_DUPLICATE_DETECTION_ID.toString(),
UUID.randomUUID().toString());
+ addressControl.sendMessage(headers, Message.BYTES_TYPE,
Base64.encodeBytes("test".getBytes()), false, null, null);
+ addressControl.sendMessage(headers, Message.BYTES_TYPE,
Base64.encodeBytes("test".getBytes()), false, null, null);
+ headers.clear();
+ headers.put(Message.HDR_DUPLICATE_DETECTION_ID.toString(),
UUID.randomUUID().toString());
+ addressControl.sendMessage(headers, Message.BYTES_TYPE,
Base64.encodeBytes("test".getBytes()), false, null, null);
+
+ Wait.assertTrue(() -> addressControl.getCurrentDuplicateIdCacheSize() ==
2);
+
+ if (clear) {
+ assertTrue(addressControl.clearDuplicateIdCache());
+ Wait.assertTrue(() -> addressControl.getCurrentDuplicateIdCacheSize()
== 0);
+ }
+ }
+
// Package protected ---------------------------------------------
// Protected -----------------------------------------------------
diff --git
a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/AddressControlUsingCoreTest.java
b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/AddressControlUsingCoreTest.java
index c76f4d7..31355fd 100644
---
a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/AddressControlUsingCoreTest.java
+++
b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/AddressControlUsingCoreTest.java
@@ -139,6 +139,16 @@ public class AddressControlUsingCoreTest extends
AddressControlTest {
}
@Override
+ public long getCurrentDuplicateIdCacheSize() {
+ return (long)
proxy.retrieveAttributeValue("currentDuplicateIdCacheSize");
+ }
+
+ @Override
+ public boolean clearDuplicateIdCache() throws Exception {
+ return (boolean) proxy.invokeOperation("clearDuplicateIdCache");
+ }
+
+ @Override
public String sendMessage(Map<String, String> headers,
int type,
String body,