From 26d6bb3963a440a7fb1883d9df58886e8b0993e6 Mon Sep 17 00:00:00 2001 From: Andy Taylor Date: Mon, 12 Jun 2017 16:20:43 +0100 Subject: [PATCH] ARTEMIS-1224 - change the journal file size to nearest multiple https://issues.apache.org/jira/browse/ARTEMIS-1224 --- .../impl/journal/JournalStorageManager.java | 12 +++- .../core/server/ActiveMQServerLogger.java | 4 ++ .../persistence/JournalFileSizeTest.java | 63 +++++++++++++++++++ 3 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/persistence/JournalFileSizeTest.java 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 9c122b323e..4f041a854b 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 @@ -142,7 +142,17 @@ public class JournalStorageManager extends AbstractJournalStorageManager { journalFF.setDatasync(config.isJournalDatasync()); - Journal localMessage = new JournalImpl(ioExecutors, config.getJournalFileSize(), config.getJournalMinFiles(), config.getJournalPoolFiles(), config.getJournalCompactMinFiles(), config.getJournalCompactPercentage(), journalFF, "activemq-data", "amq", journalFF.getMaxIO(), 0); + + int fileSize = config.getJournalFileSize(); + // we need to correct the file size if its not a multiple of the alignement + if (fileSize % journalFF.getAlignment() != 0) { + int difference = fileSize % journalFF.getAlignment(); + 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); messageJournal = localMessage; originalMessageJournal = localMessage; diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActiveMQServerLogger.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActiveMQServerLogger.java index 733dc3c8d6..acb9a1c256 100644 --- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActiveMQServerLogger.java +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActiveMQServerLogger.java @@ -333,6 +333,10 @@ public interface ActiveMQServerLogger extends BasicLogger { format = Message.Format.MESSAGE_FORMAT) void reloadingConfiguration(String module); + @LogMessage(level = Logger.Level.INFO) + @Message(id = 221057, value = "resetting Journal File size from {0} to {1} to fit with alignment of {2}", format = Message.Format.MESSAGE_FORMAT) + void invalidJournalFileSize(int journalFileSize, int fileSize, int alignment); + @LogMessage(level = Logger.Level.WARN) @Message(id = 222000, value = "ActiveMQServer is being finalized and has not been stopped. Please remember to stop the server before letting it go out of scope", format = Message.Format.MESSAGE_FORMAT) diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/persistence/JournalFileSizeTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/persistence/JournalFileSizeTest.java new file mode 100644 index 0000000000..6a72095437 --- /dev/null +++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/persistence/JournalFileSizeTest.java @@ -0,0 +1,63 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.activemq.artemis.tests.integration.persistence; + + +import org.apache.activemq.artemis.core.config.impl.ConfigurationImpl; +import org.apache.activemq.artemis.core.persistence.impl.journal.JournalStorageManager; +import org.apache.activemq.artemis.utils.OrderedExecutorFactory; +import org.junit.Assert; +import org.junit.Test; + +public class JournalFileSizeTest { + + @Test + public void testIncorrectFileSizeLower() { + ConfigurationImpl config = new ConfigurationImpl(); + int origFileSize = config.getJournalFileSize(); + config.setJournalFileSize(origFileSize + (512 / 2 - 1)); + JournalStorageManager manager = new JournalStorageManager(config, + new OrderedExecutorFactory(null), + new OrderedExecutorFactory(null)); + int fileSize = manager.getMessageJournal().getFileSize(); + Assert.assertEquals(origFileSize, fileSize); + } + + @Test + public void testIncorrectFileSizeHigher() { + ConfigurationImpl config = new ConfigurationImpl(); + int origFileSize = config.getJournalFileSize(); + config.setJournalFileSize(origFileSize + (512 / 2 + 1)); + JournalStorageManager manager = new JournalStorageManager(config, + new OrderedExecutorFactory(null), + new OrderedExecutorFactory(null)); + int fileSize = manager.getMessageJournal().getFileSize(); + Assert.assertEquals(origFileSize + 512, fileSize); + } + + @Test + public void testIncorrectFileSizeHalf() { + ConfigurationImpl config = new ConfigurationImpl(); + int origFileSize = config.getJournalFileSize(); + config.setJournalFileSize(origFileSize + (512 / 2)); + JournalStorageManager manager = new JournalStorageManager(config, + new OrderedExecutorFactory(null), + new OrderedExecutorFactory(null)); + int fileSize = manager.getMessageJournal().getFileSize(); + Assert.assertEquals(origFileSize + 512, fileSize); + } +}