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


Reply via email to