You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@activemq.apache.org by "clebert suconic (JIRA)" <ji...@apache.org> on 2019/01/18 02:20:04 UTC

[jira] [Closed] (ARTEMIS-1536) Incorrect Journal filesize calculation where specified size is lest that the block size when using AIO

     [ https://issues.apache.org/jira/browse/ARTEMIS-1536?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

clebert suconic closed ARTEMIS-1536.
------------------------------------
       Resolution: Fixed
    Fix Version/s: 2.6.4
                   2.7.0

> Incorrect Journal filesize calculation where specified size is lest that the block size when using AIO
> ------------------------------------------------------------------------------------------------------
>
>                 Key: ARTEMIS-1536
>                 URL: https://issues.apache.org/jira/browse/ARTEMIS-1536
>             Project: ActiveMQ Artemis
>          Issue Type: Bug
>          Components: Broker
>    Affects Versions: 1.5.5
>            Reporter: Jeff Mesnil
>            Priority: Major
>             Fix For: 2.7.0, 2.6.4
>
>          Time Spent: 20m
>  Remaining Estimate: 0h
>
> This issue was discovered in WildFly (https://issues.jboss.org/browse/WFLY-9595) as a side effect of: https://github.com/wildfly/wildfly/commit/df9e16241207ebc412ddd16c790c4b7fee31a5c0
> This change updated the size to be 1024 for the tests as a large file was not necessary. For continuous integration the agents have a blocksize of 512 so as the configured size is a multiple of the blocksize this was fine.
> However running the test 'org.jboss.as.test.integration.domain.ExpressionSupportSmokeTestCase' on a machine with a blocksize of 4096 this test would fail as the servers would fail to boot.
> After some debugging it became aparant this was the underlying error:
> {code}
> {"jboss.messaging-activemq.default.jms.manager" => "java.lang.IllegalArgumentException: File size cannot be less than 1024 bytes
>     Caused by: java.lang.IllegalArgumentException: File size cannot be less than 1024 bytes"}
> {code}
> After further debugging I have tracked it down to this class 'org.apache.activemq.artemis.core.persistence.impl.journal.JournalStorageManager' 
> I can confirm the configured value does make it to this class but it is the following block of code which then looses the value:
> {code}
>       int fileSize = config.getJournalFileSize();
>       // we need to correct the file size if its not a multiple of the alignement
>       int modulus = fileSize % journalFF.getAlignment();
>       if (modulus != 0) {
>          int difference = modulus;
>          int low = config.getJournalFileSize() - difference;
>          int high = low + journalFF.getAlignment();
>          fileSize = difference < journalFF.getAlignment() / 2 ? low : high;
>          ActiveMQServerLogger.LOGGER.invalidJournalFileSize(config.getJournalFileSize(), fileSize, journalFF.getAlignment());
>       }
>       Journal localMessage = new JournalImpl(ioExecutors, fileSize, config.getJournalMinFiles(), config.getJournalPoolFiles(), config.getJournalCompactMinFiles(), config.getJournalCompactPercentage(), journalFF, "activemq-data", "amq", journalFF.getMaxIO(), 0);
> {code}
> The file size comes in as 1024, the default is AIO so getAlignment returns the blocksize which in this case is 4096. So modulus and subsequently difference become 1024.
> The file size and difference are both 1024 so low becomes 0, high becomes 4096. Due to the difference being less than half the block size low is selected and the file size is set to 0.
> To select a correct filesize it looks like if low is less than the alignment always select high should be an option.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)