You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by cl...@apache.org on 2019/07/30 22:05:05 UTC

[activemq-artemis] 02/03: ARTEMIS-2435 Configuration on device-block-size through CLI / broker.xml

This is an automated email from the ASF dual-hosted git repository.

clebertsuconic pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/activemq-artemis.git

commit 80190860cc09f5dfa5b628db9e4987dc21e7136b
Author: Clebert Suconic <cl...@apache.org>
AuthorDate: Tue Jul 30 13:30:20 2019 -0400

    ARTEMIS-2435 Configuration on device-block-size through CLI / broker.xml
---
 .../org/apache/activemq/artemis/cli/commands/Create.java    | 12 +++++++++++-
 .../org/apache/activemq/artemis/cli/commands/etc/broker.xml |  2 ++
 .../apache/activemq/artemis/core/config/Configuration.java  | 11 +++++++++++
 .../artemis/core/config/impl/ConfigurationImpl.java         | 13 +++++++++++++
 .../core/deployers/impl/FileConfigurationParser.java        |  2 ++
 .../persistence/impl/journal/JournalStorageManager.java     |  4 ++++
 .../src/main/resources/schema/artemis-configuration.xsd     | 10 ++++++++++
 .../artemis/core/config/impl/ConfigurationImplTest.java     |  1 +
 .../artemis/core/config/impl/FileConfigurationTest.java     |  1 +
 .../src/test/resources/ConfigurationTest-full-config.xml    |  1 +
 .../test/resources/ConfigurationTest-xinclude-config.xml    |  1 +
 11 files changed, 57 insertions(+), 1 deletion(-)

diff --git a/artemis-cli/src/main/java/org/apache/activemq/artemis/cli/commands/Create.java b/artemis-cli/src/main/java/org/apache/activemq/artemis/cli/commands/Create.java
index 12e7446..99d4b13 100644
--- a/artemis-cli/src/main/java/org/apache/activemq/artemis/cli/commands/Create.java
+++ b/artemis-cli/src/main/java/org/apache/activemq/artemis/cli/commands/Create.java
@@ -266,10 +266,12 @@ public class Create extends InputAbstract {
    @Option(name = "--no-fsync", description = "Disable usage of fdatasync (channel.force(false) from java nio) on the journal")
    private boolean noJournalSync;
 
+   @Option(name = "--device-block-size", description = "The block size by the device, default at 4096.")
+   private int journalDeviceBlockSize = 4096;
+
    @Option(name = "--global-max-size", description = "Maximum amount of memory which message data may consume (Default: Undefined, half of the system's memory)")
    private String globalMaxSize;
 
-
    @Option(name = "--jdbc", description = "It will activate jdbc")
    boolean jdbc;
 
@@ -548,6 +550,14 @@ public class Create extends InputAbstract {
 
       HashMap<String, String> filters = new LinkedHashMap<>();
 
+      if (journalDeviceBlockSize % 512 != 0) {
+         // This will generate a CLI error
+         // no need to a logger here as this would be just a regular UI output
+         throw new IllegalArgumentException("You must pass a device-block-size multiple of 512");
+      }
+
+      filters.put("${device-block-size}", Integer.toString(journalDeviceBlockSize));
+
       filters.put("${master-slave}", isSlave() ? "slave" : "master");
 
       filters.put("${failover-on-shutdown}", isFailoverOnShutodwn() ? "true" : "false");
diff --git a/artemis-cli/src/main/resources/org/apache/activemq/artemis/cli/commands/etc/broker.xml b/artemis-cli/src/main/resources/org/apache/activemq/artemis/cli/commands/etc/broker.xml
index 772c7bd..4472c46 100644
--- a/artemis-cli/src/main/resources/org/apache/activemq/artemis/cli/commands/etc/broker.xml
+++ b/artemis-cli/src/main/resources/org/apache/activemq/artemis/cli/commands/etc/broker.xml
@@ -52,6 +52,8 @@ ${jdbc}
 
       <journal-pool-files>10</journal-pool-files>
 
+      <journal-device-block-size>${device-block-size}</journal-device-block-size>
+
       <journal-file-size>10M</journal-file-size>
       ${journal-buffer.settings}${ping-config.settings}${connector-config.settings}
 
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 0bc2b63..40fb4f3 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
@@ -735,6 +735,17 @@ public interface Configuration {
     */
    Configuration setJournalBufferTimeout_AIO(int journalBufferTimeout);
 
+   /** This is the device block size used on writing.
+    * This is usually translated as st_blksize from fstat.
+    * returning null mans the system should instead make a call on fstat and use st_blksize.
+    *  The intention of this setting was to bypass the value in certain devices that will return a huge number as their block size (e.g. CephFS) */
+   Integer getJournalDeviceBlockSize();
+
+   /**
+    * @see #getJournalDeviceBlockSize()
+    */
+   Configuration setJournalDeviceBlockSize(Integer deviceBlockSize);
+
    /**
     * Returns the buffer size (in bytes) for AIO.
     * <br>
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 31624f3..db83e5a 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
@@ -212,6 +212,8 @@ public class ConfigurationImpl implements Configuration, Serializable {
 
    protected int journalBufferTimeout_AIO = ActiveMQDefaultConfiguration.getDefaultJournalBufferTimeoutAio();
 
+   protected Integer deviceBlockSize = null;
+
    protected int journalBufferSize_AIO = ActiveMQDefaultConfiguration.getDefaultJournalBufferSizeAio();
 
    protected int journalMaxIO_NIO = ActiveMQDefaultConfiguration.getDefaultJournalMaxIoNio();
@@ -1289,6 +1291,17 @@ public class ConfigurationImpl implements Configuration, Serializable {
    }
 
    @Override
+   public Integer getJournalDeviceBlockSize() {
+      return deviceBlockSize;
+   }
+
+   @Override
+   public ConfigurationImpl setJournalDeviceBlockSize(Integer deviceBlockSize) {
+      this.deviceBlockSize = deviceBlockSize;
+      return this;
+   }
+
+   @Override
    public ConfigurationImpl setJournalBufferTimeout_AIO(final int journalBufferTimeout) {
       journalBufferTimeout_AIO = journalBufferTimeout;
       return this;
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 aa1effb..8171210 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
@@ -605,6 +605,8 @@ public final class FileConfigurationParser extends XMLConfigurationUtil {
 
       int journalMaxIO = getInteger(e, "journal-max-io", config.getJournalType() == JournalType.ASYNCIO ? ActiveMQDefaultConfiguration.getDefaultJournalMaxIoAio() : ActiveMQDefaultConfiguration.getDefaultJournalMaxIoNio(), Validators.GT_ZERO);
 
+      config.setJournalDeviceBlockSize(getInteger(e, "journal-device-block-size", null, Validators.MINUS_ONE_OR_GE_ZERO));
+
       if (config.getJournalType() == JournalType.ASYNCIO) {
          config.setJournalBufferTimeout_AIO(journalBufferTimeout);
          config.setJournalBufferSize_AIO(journalBufferSize);
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/JournalStorageManager.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/JournalStorageManager.java
index c06b640..2ae475c 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/JournalStorageManager.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/JournalStorageManager.java
@@ -148,6 +148,10 @@ public class JournalStorageManager extends AbstractJournalStorageManager {
                ActiveMQServerLogger.LOGGER.journalUseAIO();
             }
             journalFF = new AIOSequentialFileFactory(config.getJournalLocation(), config.getJournalBufferSize_AIO(), config.getJournalBufferTimeout_AIO(), config.getJournalMaxIO_AIO(), config.isLogJournalWriteRate(), criticalErrorListener, getCriticalAnalyzer());
+
+            if (config.getJournalDeviceBlockSize() != null) {
+               journalFF.setAlignment(config.getJournalDeviceBlockSize());
+            }
             break;
          case MAPPED:
             if (criticalErrorListener != null) {
diff --git a/artemis-server/src/main/resources/schema/artemis-configuration.xsd b/artemis-server/src/main/resources/schema/artemis-configuration.xsd
index 03ff9f8..78d5ba4 100644
--- a/artemis-server/src/main/resources/schema/artemis-configuration.xsd
+++ b/artemis-server/src/main/resources/schema/artemis-configuration.xsd
@@ -673,6 +673,16 @@
             </xsd:annotation>
          </xsd:element>
 
+
+         <xsd:element name="journal-device-block-size" type="xsd:long" maxOccurs="1" minOccurs="0">
+            <xsd:annotation>
+               <xsd:documentation>
+                  The size in bytes used by the device. This is usually translated as fstat/st_blksize
+                  And this is a way to bypass the value returned as st_blksize.
+               </xsd:documentation>
+            </xsd:annotation>
+         </xsd:element>
+
          <xsd:element name="journal-buffer-size" type="xsd:string" default="501760" maxOccurs="1" minOccurs="0">
             <xsd:annotation>
                <xsd:documentation>
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 8509450..22e577e 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
@@ -87,6 +87,7 @@ public class ConfigurationImplTest extends ActiveMQTestBase {
       Assert.assertEquals(ActiveMQDefaultConfiguration.getDefaultMemoryWarningThreshold(), conf.getMemoryWarningThreshold());
       Assert.assertEquals(ActiveMQDefaultConfiguration.getDefaultMemoryMeasureInterval(), conf.getMemoryMeasureInterval());
       Assert.assertEquals(conf.getJournalLocation(), conf.getNodeManagerLockLocation());
+      Assert.assertNull(conf.getJournalDeviceBlockSize());
    }
 
    @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 d0934dd..91f92aa 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
@@ -117,6 +117,7 @@ public class FileConfigurationTest extends ConfigurationImplTest {
       Assert.assertEquals(25000, conf.getAddressQueueScanPeriod());
       Assert.assertEquals(127, conf.getIDCacheSize());
       Assert.assertEquals(true, conf.isPersistIDCache());
+      Assert.assertEquals(Integer.valueOf(777), conf.getJournalDeviceBlockSize());
       Assert.assertEquals(true, conf.isPersistDeliveryCountBeforeDelivery());
       Assert.assertEquals("pagingdir", conf.getPagingDirectory());
       Assert.assertEquals("somedir", conf.getBindingsDirectory());
diff --git a/artemis-server/src/test/resources/ConfigurationTest-full-config.xml b/artemis-server/src/test/resources/ConfigurationTest-full-config.xml
index 9042426..9815511 100644
--- a/artemis-server/src/test/resources/ConfigurationTest-full-config.xml
+++ b/artemis-server/src/test/resources/ConfigurationTest-full-config.xml
@@ -356,6 +356,7 @@
       <journal-compact-min-files>123</journal-compact-min-files>
       <journal-max-io>56546</journal-max-io>
       <journal-file-open-timeout>9876</journal-file-open-timeout>
+      <journal-device-block-size>777</journal-device-block-size>
       <server-dump-interval>5000</server-dump-interval>
       <memory-warning-threshold>95</memory-warning-threshold>
       <memory-measure-interval>54321</memory-measure-interval>
diff --git a/artemis-server/src/test/resources/ConfigurationTest-xinclude-config.xml b/artemis-server/src/test/resources/ConfigurationTest-xinclude-config.xml
index dc8dc45..4a1ece0 100644
--- a/artemis-server/src/test/resources/ConfigurationTest-xinclude-config.xml
+++ b/artemis-server/src/test/resources/ConfigurationTest-xinclude-config.xml
@@ -270,6 +270,7 @@
       <journal-compact-min-files>123</journal-compact-min-files>
       <journal-max-io>56546</journal-max-io>
       <journal-file-open-timeout>9876</journal-file-open-timeout>
+      <journal-device-block-size>777</journal-device-block-size>
       <server-dump-interval>5000</server-dump-interval>
       <memory-warning-threshold>95</memory-warning-threshold>
       <memory-measure-interval>54321</memory-measure-interval>