This is an automated email from the ASF dual-hosted git repository.
gtully 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 2aaf256295 ARTEMIS-5333 add config for
global-max-size-percent-of-jvm-max-memory to simplify setting the global memory
limit
2aaf256295 is described below
commit 2aaf2562955b3031cf61acfc83b368da919fb939
Author: Gary Tully <[email protected]>
AuthorDate: Thu Feb 27 14:53:37 2025 +0000
ARTEMIS-5333 add config for global-max-size-percent-of-jvm-max-memory to
simplify setting the global memory limit
---
.../api/config/ActiveMQDefaultConfiguration.java | 9 +++------
.../activemq/artemis/core/config/Configuration.java | 4 ++++
.../artemis/core/config/impl/ConfigurationImpl.java | 13 ++++++++++++-
.../core/deployers/impl/FileConfigurationParser.java | 4 ++++
.../main/resources/schema/artemis-configuration.xsd | 10 +++++++++-
.../core/config/impl/ConfigurationImplTest.java | 18 ++++++++++++++++++
.../core/config/impl/FileConfigurationParserTest.java | 2 ++
.../core/config/impl/FileConfigurationTest.java | 1 +
.../test/resources/ConfigurationTest-full-config.xml | 1 +
.../resources/ConfigurationTest-xinclude-config.xml | 1 +
.../ConfigurationTest-xinclude-schema-config.xml | 1 +
docs/user-manual/paging.adoc | 2 +-
12 files changed, 57 insertions(+), 9 deletions(-)
diff --git
a/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/config/ActiveMQDefaultConfiguration.java
b/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/config/ActiveMQDefaultConfiguration.java
index 2876929513..9546ab2f95 100644
---
a/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/config/ActiveMQDefaultConfiguration.java
+++
b/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/config/ActiveMQDefaultConfiguration.java
@@ -501,7 +501,7 @@ public final class ActiveMQDefaultConfiguration {
public static final boolean DEFAULT_AMQP_USE_CORE_SUBSCRIPTION_NAMING =
false;
- public static final long DEFAULT_GLOBAL_MAX_SIZE =
Runtime.getRuntime().maxMemory() / 2;
+ public static final int DEFAULT_GLOBAL_MAX_MEMORY_PERCENT = 50;
public static final long DEFAULT_GLOBAL_MAX_MESSAGES = -1;
@@ -1589,11 +1589,8 @@ public final class ActiveMQDefaultConfiguration {
return DEFAULT_AMQP_USE_CORE_SUBSCRIPTION_NAMING;
}
- /**
- * The default global max size. -1 = no global max size.
- */
- public static long getDefaultMaxGlobalSize() {
- return DEFAULT_GLOBAL_MAX_SIZE;
+ public static long getDefaultMaxGlobalSizeAsPercentOfJvmMaxMemory(int
percentOfJvmMaxMemory) {
+ return (long) (Runtime.getRuntime().maxMemory() * (percentOfJvmMaxMemory
/ 100.0f));
}
public static long getDefaultMaxGlobalMessages() {
diff --git
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/Configuration.java
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/Configuration.java
index 9dde060a20..41bbe55d19 100644
---
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/Configuration.java
+++
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/Configuration.java
@@ -1272,6 +1272,10 @@ public interface Configuration {
Configuration setConfigurationFileRefreshPeriod(long
configurationFileRefreshPeriod);
+ int getGlobalMaxSizePercentOfJvmMaxMemory();
+
+ ConfigurationImpl setGlobalMaxSizePercentOfJvmMaxMemory(int
percentOfJvmMaxMemory);
+
long getGlobalMaxSize();
Configuration setGlobalMaxSize(long globalMaxSize);
diff --git
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImpl.java
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImpl.java
index 1bc8e2b3cf..04cf003bd6 100644
---
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImpl.java
+++
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImpl.java
@@ -463,6 +463,7 @@ public class ConfigurationImpl implements Configuration,
Serializable {
private boolean mirrorPageTransaction =
ActiveMQDefaultConfiguration.getMirrorPageTransaction();
+ private int globalMaxSizePercentOfJvmMaxMemory =
ActiveMQDefaultConfiguration.DEFAULT_GLOBAL_MAX_MEMORY_PERCENT;
/**
* Parent folder for all data folders.
@@ -1258,7 +1259,7 @@ public class ConfigurationImpl implements Configuration,
Serializable {
@Override
public long getGlobalMaxSize() {
if (globalMaxSize == null) {
- this.globalMaxSize =
ActiveMQDefaultConfiguration.getDefaultMaxGlobalSize();
+ this.globalMaxSize =
ActiveMQDefaultConfiguration.getDefaultMaxGlobalSizeAsPercentOfJvmMaxMemory(getGlobalMaxSizePercentOfJvmMaxMemory());
if (!Env.isTestEnv()) {
ActiveMQServerLogger.LOGGER.usingDefaultPaging(globalMaxSize);
}
@@ -1266,6 +1267,16 @@ public class ConfigurationImpl implements Configuration,
Serializable {
return globalMaxSize;
}
+ @Override
+ public int getGlobalMaxSizePercentOfJvmMaxMemory() {
+ return globalMaxSizePercentOfJvmMaxMemory;
+ }
+
+ @Override
+ public ConfigurationImpl setGlobalMaxSizePercentOfJvmMaxMemory(int
percentOfJvmMaxMemory) {
+ this.globalMaxSizePercentOfJvmMaxMemory = percentOfJvmMaxMemory;
+ return this;
+ }
@Override
public ConfigurationImpl setGlobalMaxMessages(long maxMessages) {
diff --git
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/deployers/impl/FileConfigurationParser.java
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/deployers/impl/FileConfigurationParser.java
index 48c04105ae..31c7b40d6b 100644
---
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/deployers/impl/FileConfigurationParser.java
+++
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/deployers/impl/FileConfigurationParser.java
@@ -359,6 +359,8 @@ public final class FileConfigurationParser extends
XMLConfigurationUtil {
private static final String GLOBAL_MAX_SIZE = "global-max-size";
+ private static final String GLOBAL_MAX_SIZE_PERCENT_JVM_MAX_MEM =
"global-max-size-percent-of-jvm-max-memory";
+
private static final String GLOBAL_MAX_MESSAGES = "global-max-messages";
public static final String MAX_DISK_USAGE = "max-disk-usage";
@@ -505,6 +507,8 @@ public final class FileConfigurationParser extends
XMLConfigurationUtil {
config.setMqttSessionStatePersistenceTimeout(getLong(e,
"mqtt-session-state-persistence-timeout",
config.getMqttSessionStatePersistenceTimeout(), GT_ZERO));
+ config.setGlobalMaxSizePercentOfJvmMaxMemory(getInteger(e,
GLOBAL_MAX_SIZE_PERCENT_JVM_MAX_MEM,
config.getGlobalMaxSizePercentOfJvmMaxMemory(), GT_ZERO));
+
long globalMaxSize = getTextBytesAsLongBytes(e, GLOBAL_MAX_SIZE, -1,
MINUS_ONE_OR_GT_ZERO);
if (globalMaxSize > 0) {
diff --git a/artemis-server/src/main/resources/schema/artemis-configuration.xsd
b/artemis-server/src/main/resources/schema/artemis-configuration.xsd
index 4137a140f1..1b3698788b 100644
--- a/artemis-server/src/main/resources/schema/artemis-configuration.xsd
+++ b/artemis-server/src/main/resources/schema/artemis-configuration.xsd
@@ -799,7 +799,15 @@
<xsd:annotation>
<xsd:documentation>
Number of messages before all addresses will enter into
their Full Policy configured.
- It works in conjunction with global-max-size, being watever
value hits its maximum first.
+ It works in conjunction with global-max-size, being whatever
value hits its maximum first.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+
+ <xsd:element name="global-max-size-percent-of-jvm-max-memory"
type="xsd:string" default="50" maxOccurs="1" minOccurs="0">
+ <xsd:annotation>
+ <xsd:documentation>
+ Percentage of JVM Runtime Max Memory that should be used by
default for global-max-size.
</xsd:documentation>
</xsd:annotation>
</xsd:element>
diff --git
a/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImplTest.java
b/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImplTest.java
index 32830ebe1a..06f35cd3ef 100644
---
a/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImplTest.java
+++
b/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImplTest.java
@@ -2630,6 +2630,24 @@ public class ConfigurationImplTest extends
AbstractConfigurationTestBase {
assertEquals("foo.class.bar",
ConfigurationImpl.extractPropertyClassName("foo.class.bar.class"));
}
+ @Test
+ public void testGlobalMaxSizePercentOfJvmMaxMemory() throws Exception {
+
+ // existing default
+ long half = Runtime.getRuntime().maxMemory() / 2;
+ ConfigurationImpl configuration = new ConfigurationImpl();
+ assertEquals(half, configuration.getGlobalMaxSize());
+
+ configuration.setGlobalMaxSizePercentOfJvmMaxMemory(25);
+ assertEquals(half, configuration.getGlobalMaxSize());
+
+ // needs new instance
+ configuration = new ConfigurationImpl();
+ configuration.setGlobalMaxSizePercentOfJvmMaxMemory(25);
+ long quarter = Runtime.getRuntime().maxMemory() / 4;
+ assertEquals(quarter, configuration.getGlobalMaxSize());
+ }
+
public static class DummyConfig {
private int intProperty;
private int idCacheSize;
diff --git
a/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/FileConfigurationParserTest.java
b/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/FileConfigurationParserTest.java
index 09bdc01aae..1e11b12175 100644
---
a/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/FileConfigurationParserTest.java
+++
b/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/FileConfigurationParserTest.java
@@ -768,6 +768,7 @@ public class FileConfigurationParserTest extends
ServerTestBase {
<core>
<global-max-size>10M</global-max-size>
<global-max-messages>1000</global-max-messages>
+
<global-max-size-percent-of-jvm-max-memory>30</global-max-size-percent-of-jvm-max-memory>
</core>
</configuration>""");
@@ -777,6 +778,7 @@ public class FileConfigurationParserTest extends
ServerTestBase {
assertEquals(10 * 1024 * 1024, configuration.getGlobalMaxSize());
assertEquals(1000, configuration.getGlobalMaxMessages());
+ assertEquals(30, configuration.getGlobalMaxSizePercentOfJvmMaxMemory());
}
@Test
diff --git
a/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/FileConfigurationTest.java
b/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/FileConfigurationTest.java
index be2c322ae4..ec7a6031c6 100644
---
a/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/FileConfigurationTest.java
+++
b/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/FileConfigurationTest.java
@@ -646,6 +646,7 @@ public class FileConfigurationTest extends
AbstractConfigurationTestBase {
assertTrue(a2Role.isDeleteNonDurableQueue());
assertFalse(a2Role.isManage());
assertEquals(1234567, configInstance.getGlobalMaxSize());
+ assertEquals(30, configInstance.getGlobalMaxSizePercentOfJvmMaxMemory());
assertEquals(37, configInstance.getMaxDiskUsage());
assertEquals(123, configInstance.getDiskScanPeriod());
diff --git
a/artemis-server/src/test/resources/ConfigurationTest-full-config.xml
b/artemis-server/src/test/resources/ConfigurationTest-full-config.xml
index db79760739..03d54aeacc 100644
--- a/artemis-server/src/test/resources/ConfigurationTest-full-config.xml
+++ b/artemis-server/src/test/resources/ConfigurationTest-full-config.xml
@@ -62,6 +62,7 @@
<configuration-file-refresh-period>1234567</configuration-file-refresh-period>
<temporary-queue-namespace>TEMP</temporary-queue-namespace>
<global-max-size>1234567</global-max-size>
+
<global-max-size-percent-of-jvm-max-memory>30</global-max-size-percent-of-jvm-max-memory>
<max-disk-usage>37</max-disk-usage>
<min-disk-free>500Mb</min-disk-free>
<disk-scan-period>123</disk-scan-period>
diff --git
a/artemis-server/src/test/resources/ConfigurationTest-xinclude-config.xml
b/artemis-server/src/test/resources/ConfigurationTest-xinclude-config.xml
index 40977255a2..33e8f8de60 100644
--- a/artemis-server/src/test/resources/ConfigurationTest-xinclude-config.xml
+++ b/artemis-server/src/test/resources/ConfigurationTest-xinclude-config.xml
@@ -63,6 +63,7 @@
<configuration-file-refresh-period>1234567</configuration-file-refresh-period>
<temporary-queue-namespace>TEMP</temporary-queue-namespace>
<global-max-size>1234567</global-max-size>
+
<global-max-size-percent-of-jvm-max-memory>30</global-max-size-percent-of-jvm-max-memory>
<max-disk-usage>37</max-disk-usage>
<disk-scan-period>123</disk-scan-period>
<critical-analyzer-policy>HALT</critical-analyzer-policy>
diff --git
a/artemis-server/src/test/resources/ConfigurationTest-xinclude-schema-config.xml
b/artemis-server/src/test/resources/ConfigurationTest-xinclude-schema-config.xml
index c26879b294..c8b4f35244 100644
---
a/artemis-server/src/test/resources/ConfigurationTest-xinclude-schema-config.xml
+++
b/artemis-server/src/test/resources/ConfigurationTest-xinclude-schema-config.xml
@@ -63,6 +63,7 @@
<configuration-file-refresh-period>1234567</configuration-file-refresh-period>
<temporary-queue-namespace>TEMP</temporary-queue-namespace>
<global-max-size>1234567</global-max-size>
+
<global-max-size-percent-of-jvm-max-memory>30</global-max-size-percent-of-jvm-max-memory>
<max-disk-usage>37</max-disk-usage>
<disk-scan-period>123</disk-scan-period>
<critical-analyzer-policy>HALT</critical-analyzer-policy>
diff --git a/docs/user-manual/paging.adoc b/docs/user-manual/paging.adoc
index c5c8537fa9..ef35aa8bbe 100644
--- a/docs/user-manual/paging.adoc
+++ b/docs/user-manual/paging.adoc
@@ -158,7 +158,7 @@ You can also specify `global-max-messages` on the main
configuration, specifying
When you have more messages than what is configured `global-max-size` any new
produced message will make that destination to go through its paging policy.
-`global-max-size` is calculated as half of the max memory available to the
Java Virtual Machine, unless specified on the `broker.xml` configuration.
+`global-max-size` is calculated as a percentage of the max memory available to
the Java Virtual Machine, unless specified in the broker.xml configuration
directly. The percentage value used is configurable using the option
`global-max-size-percent-of-jvm-max-memory` in the XML configuration and if not
specified the default value of `global-max-size-percent-of-jvm-max-memory` is
50% or half the max available memory.
By default `global-max-messages` = `-1` meaning it's disabled.
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
For further information, visit: https://activemq.apache.org/contact