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
The following commit(s) were added to refs/heads/master by this push:
new 39fd58f ARTEMIS-2258 The FileLockNodeManager directory should be
configurable
new 2a3ce34 This closes #2559
39fd58f is described below
commit 39fd58f71969678a0a9429aedad64d331be0ca3c
Author: Francesco Nigro <[email protected]>
AuthorDate: Thu Feb 21 15:22:01 2019 +0100
ARTEMIS-2258 The FileLockNodeManager directory should be configurable
---
.../artemis/core/config/Configuration.java | 10 +++++++
.../core/config/impl/ConfigurationImpl.java | 17 +++++++++++
.../deployers/impl/FileConfigurationParser.java | 2 ++
.../core/server/impl/ActiveMQServerImpl.java | 11 ++++++--
.../resources/schema/artemis-configuration.xsd | 8 ++++++
.../core/config/impl/ConfigurationImplTest.java | 22 +++++++++++++++
.../src/test/resources/artemis-configuration.xsd | 8 ++++++
docs/user-manual/en/configuration-index.md | 1 +
docs/user-manual/en/persistence.md | 8 ++++++
.../cluster/failover/NettyFailoverTest.java | 33 ++++++++++++++++++----
10 files changed, 113 insertions(+), 7 deletions(-)
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 49c90fd..783adca 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
@@ -597,6 +597,16 @@ public interface Configuration {
File getJournalLocation();
/**
+ * The location of the node manager lock file related to artemis.instance.
+ */
+ File getNodeManagerLockLocation();
+
+ /**
+ * Sets the file system directory used to store the node manager lock file.
+ */
+ Configuration setNodeManagerLockDirectory(String dir);
+
+ /**
* Sets the file system directory used to store journal log.
*/
Configuration setJournalDirectory(String dir);
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 fa6ea63..7df8fb1 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
@@ -183,6 +183,8 @@ public class ConfigurationImpl implements Configuration,
Serializable {
protected String journalDirectory =
ActiveMQDefaultConfiguration.getDefaultJournalDir();
+ protected String nodeManagerLockDirectory = null;
+
protected boolean createJournalDir =
ActiveMQDefaultConfiguration.isDefaultCreateJournalDir();
public JournalType journalType = ConfigurationImpl.DEFAULT_JOURNAL_TYPE;
@@ -819,6 +821,21 @@ public class ConfigurationImpl implements Configuration,
Serializable {
}
@Override
+ public File getNodeManagerLockLocation() {
+ if (nodeManagerLockDirectory == null) {
+ return getJournalLocation();
+ } else {
+ return subFolder(nodeManagerLockDirectory);
+ }
+ }
+
+ @Override
+ public Configuration setNodeManagerLockDirectory(String dir) {
+ nodeManagerLockDirectory = dir;
+ return this;
+ }
+
+ @Override
public JournalType getJournalType() {
return journalType;
}
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 1b6e3b8..0a838cb 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
@@ -564,6 +564,8 @@ public final class FileConfigurationParser extends
XMLConfigurationUtil {
config.setJournalDirectory(getString(e, "journal-directory",
config.getJournalDirectory(), Validators.NOT_NULL_OR_EMPTY));
+ config.setNodeManagerLockDirectory(getString(e,
"node-manager-lock-directory", null, Validators.NO_CHECK));
+
config.setPageMaxConcurrentIO(getInteger(e, "page-max-concurrent-io",
config.getPageMaxConcurrentIO(), Validators.MINUS_ONE_OR_GT_ZERO));
config.setPagingDirectory(getString(e, "paging-directory",
config.getPagingDirectory(), Validators.NOT_NULL_OR_EMPTY));
diff --git
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java
index 6cf63ad..9480f58 100644
---
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java
+++
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java
@@ -549,7 +549,7 @@ public class ActiveMQServerImpl implements ActiveMQServer {
try {
checkJournalDirectory();
- nodeManager = createNodeManager(configuration.getJournalLocation(),
false);
+ nodeManager =
createNodeManager(configuration.getNodeManagerLockLocation(), false);
nodeManager.start();
@@ -758,7 +758,7 @@ public class ActiveMQServerImpl implements ActiveMQServer {
if (nodeManager != null) {
nodeManager.stop();
}
- nodeManager = createNodeManager(configuration.getJournalLocation(),
true);
+ nodeManager =
createNodeManager(configuration.getNodeManagerLockLocation(), true);
}
@Override
@@ -3362,6 +3362,13 @@ public class ActiveMQServerImpl implements
ActiveMQServer {
throw
ActiveMQMessageBundle.BUNDLE.cannotCreateDir(journalDir.getAbsolutePath());
}
}
+
+ File nodeManagerLockDir = configuration.getNodeManagerLockLocation();
+ if (!journalDir.equals(nodeManagerLockDir)) {
+ if (configuration.isPersistenceEnabled() &&
!nodeManagerLockDir.exists()) {
+ nodeManagerLockDir.mkdirs();
+ }
+ }
}
// Inner classes
diff --git a/artemis-server/src/main/resources/schema/artemis-configuration.xsd
b/artemis-server/src/main/resources/schema/artemis-configuration.xsd
index 5a43596..89cdcc8 100644
--- a/artemis-server/src/main/resources/schema/artemis-configuration.xsd
+++ b/artemis-server/src/main/resources/schema/artemis-configuration.xsd
@@ -624,6 +624,14 @@
</xsd:annotation>
</xsd:element>
+ <xsd:element name="node-manager-lock-directory" type="xsd:string"
maxOccurs="1" minOccurs="0">
+ <xsd:annotation>
+ <xsd:documentation>
+ the directory to store the node manager lock file
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+
<xsd:element name="create-journal-dir" type="xsd:boolean"
default="true" 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 ca28e35..8509450 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
@@ -86,6 +86,7 @@ public class ConfigurationImplTest extends ActiveMQTestBase {
Assert.assertEquals(ActiveMQDefaultConfiguration.getDefaultServerDumpInterval(),
conf.getServerDumpInterval());
Assert.assertEquals(ActiveMQDefaultConfiguration.getDefaultMemoryWarningThreshold(),
conf.getMemoryWarningThreshold());
Assert.assertEquals(ActiveMQDefaultConfiguration.getDefaultMemoryMeasureInterval(),
conf.getMemoryMeasureInterval());
+ Assert.assertEquals(conf.getJournalLocation(),
conf.getNodeManagerLockLocation());
}
@Test
@@ -498,6 +499,11 @@ public class ConfigurationImplTest extends
ActiveMQTestBase {
configuration.setJournalDirectory("./data-journal");
File journalLocation = configuration.getJournalLocation();
Assert.assertFalse("This path shouldn't resolve to a real folder",
journalLocation.exists());
+ Assert.assertEquals(configuration.getJournalLocation(),
configuration.getNodeManagerLockLocation());
+
Assert.assertFalse(configuration.getNodeManagerLockLocation().exists());
+ configuration.setNodeManagerLockDirectory("./lock-folder");
+ Assert.assertNotEquals(configuration.getJournalLocation(),
configuration.getNodeManagerLockLocation());
+ Assert.assertFalse("This path shouldn't resolve to a real folder",
configuration.getNodeManagerLockLocation().exists());
} finally {
if (oldProperty == null) {
System.clearProperty("artemis.instance");
@@ -531,6 +537,22 @@ public class ConfigurationImplTest extends
ActiveMQTestBase {
File journalLocation = configuration.getJournalLocation();
Assert.assertTrue(journalLocation.exists());
+ Assert.assertEquals(configuration.getJournalLocation(),
configuration.getNodeManagerLockLocation());
+
Assert.assertTrue(configuration.getNodeManagerLockLocation().exists());
+
+ tempFolder = File.createTempFile("lock-folder", "");
+ tempFolder.delete();
+
+ tempFolder.getAbsolutePath();
+
+ tempFolder = new File(tempFolder.getAbsolutePath());
+ tempFolder.mkdirs();
+
+ System.out.println("TempFolder = " + tempFolder.getAbsolutePath());
+
configuration.setNodeManagerLockDirectory(tempFolder.getAbsolutePath());
+ File lockLocation = configuration.getNodeManagerLockLocation();
+ Assert.assertTrue(lockLocation.exists());
+
} finally {
if (oldProperty == null) {
System.clearProperty("artemis.instance");
diff --git a/artemis-tools/src/test/resources/artemis-configuration.xsd
b/artemis-tools/src/test/resources/artemis-configuration.xsd
index 61bdd8b..5a5d4f3 100644
--- a/artemis-tools/src/test/resources/artemis-configuration.xsd
+++ b/artemis-tools/src/test/resources/artemis-configuration.xsd
@@ -597,6 +597,14 @@
</xsd:annotation>
</xsd:element>
+ <xsd:element name="node-manager-lock-directory" type="xsd:string"
maxOccurs="1" minOccurs="0">
+ <xsd:annotation>
+ <xsd:documentation>
+ the directory to store the node manager lock file
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+
<xsd:element name="create-journal-dir" type="xsd:boolean"
default="true" maxOccurs="1" minOccurs="0">
<xsd:annotation>
<xsd:documentation>
diff --git a/docs/user-manual/en/configuration-index.md
b/docs/user-manual/en/configuration-index.md
index 6311f94..692b660 100644
--- a/docs/user-manual/en/configuration-index.md
+++ b/docs/user-manual/en/configuration-index.md
@@ -129,6 +129,7 @@ Name | Description | Default
[journal-compact-min-files](persistence.md#configuring-the-message-journal) |
The minimal number of data files before we can start compacting. Setting this
to 0 means compacting is disabled. | 10
[journal-compact-percentage](persistence.md#configuring-the-message-journal) |
The percentage of live data on which we consider compacting the journal. | 30
[journal-directory](persistence.md#configuring-the-message-journal) | the
directory to store the journal files in. | `data/journal`
+[node-manager-lock-directory](persistence.md#configuring-the-message-journal)
| the directory to store the node manager lock file. | same of
`journal-directory`
[journal-file-size](persistence.md#configuring-the-message-journal) | the size
(in bytes) of each journal file. | 10MB
[journal-lock-acquisition-timeout](persistence.md#configuring-the-message-journal)
| how long (in ms) to wait to acquire a file lock on the journal. | -1
[journal-max-io](persistence.md#configuring-the-message-journal) | the maximum
number of write requests that can be in the ASYNCIO queue at any one time. |
4096 for ASYNCIO; 1 for NIO; ignored for MAPPED
diff --git a/docs/user-manual/en/persistence.md
b/docs/user-manual/en/persistence.md
index 5b34898..c8994da 100644
--- a/docs/user-manual/en/persistence.md
+++ b/docs/user-manual/en/persistence.md
@@ -169,6 +169,14 @@ The message journal is configured using the following
attributes in
When the message journal is stored on a SAN we recommend each
journal instance that is stored on the SAN is given its own LUN
(logical unit).
+
+- `node-manager-lock-directory`
+
+ This is the directory in which the node manager file lock lives. By default
+ has the same value of `journal-directory`.
+
+ This is useful when the message journal is on a SAN and is being used a
[Shared Store HA](ha.md#shared-store)
+ policy with the broker instances on the same physical machine.
- `create-journal-dir`
diff --git
a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/failover/NettyFailoverTest.java
b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/failover/NettyFailoverTest.java
index b986e4e..88549db 100644
---
a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/failover/NettyFailoverTest.java
+++
b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/failover/NettyFailoverTest.java
@@ -39,6 +39,7 @@ import
org.apache.activemq.artemis.core.config.ha.SharedStoreSlavePolicyConfigur
import
org.apache.activemq.artemis.core.config.storage.DatabaseStorageConfiguration;
import org.apache.activemq.artemis.core.remoting.impl.netty.TransportConstants;
import org.apache.activemq.artemis.core.server.NodeManager;
+import org.apache.activemq.artemis.core.server.impl.FileLockNodeManager;
import org.apache.activemq.artemis.core.server.impl.InVMNodeManager;
import org.apache.activemq.artemis.core.server.impl.jdbc.JdbcNodeManager;
import
org.apache.activemq.artemis.tests.integration.cluster.util.SameProcessActiveMQServer;
@@ -58,16 +59,22 @@ import org.junit.runners.Parameterized;
public class NettyFailoverTest extends FailoverTest {
public enum NodeManagerType {
- InVM, Jdbc
+ InVM, Jdbc, File
}
- @Parameterized.Parameters(name = "{0} Node Manager")
+ @Parameterized.Parameters(name = "{0} Node Manager, Use Separate Lock
Folder = {1}")
public static Iterable<? extends Object> nodeManagerTypes() {
- return Arrays.asList(new Object[][]{{NodeManagerType.Jdbc},
{NodeManagerType.InVM}});
+ return Arrays.asList(new Object[][]{
+ {NodeManagerType.Jdbc, false},
+ {NodeManagerType.InVM, false},
+ {NodeManagerType.File, false},
+ {NodeManagerType.File, true}});
}
- @Parameterized.Parameter
+ @Parameterized.Parameter(0)
public NodeManagerType nodeManagerType;
+ @Parameterized.Parameter(1)
+ public boolean useSeparateLockFolder;
@Override
protected TransportConfiguration getAcceptorTransportConfiguration(final
boolean live) {
@@ -89,6 +96,15 @@ public class NettyFailoverTest extends FailoverTest {
}
@Override
+ protected Configuration createDefaultInVMConfig() throws Exception {
+ final Configuration config = super.createDefaultInVMConfig();
+ if (useSeparateLockFolder) {
+ config.setNodeManagerLockDirectory(getTestDir() + "/nm_lock");
+ }
+ return config;
+ }
+
+ @Override
protected NodeManager createNodeManager() throws Exception {
switch (nodeManagerType) {
@@ -111,6 +127,13 @@ public class NettyFailoverTest extends FailoverTest {
code.printStackTrace();
Assert.fail(message);
});
+ case File:
+ final Configuration config = createDefaultInVMConfig();
+ if (useSeparateLockFolder) {
+ config.getNodeManagerLockLocation().mkdirs();
+ }
+ return new
FileLockNodeManager(config.getNodeManagerLockLocation(), false);
+
default:
throw new AssertionError("enum type not supported!");
}
@@ -122,7 +145,7 @@ public class NettyFailoverTest extends FailoverTest {
final boolean isBackup = config.getHAPolicyConfiguration() instanceof
ReplicaPolicyConfiguration || config.getHAPolicyConfiguration() instanceof
SharedStoreSlavePolicyConfiguration;
NodeManager nodeManager = this.nodeManager;
//create a separate NodeManager for the backup
- if (isBackup && nodeManagerType == NodeManagerType.Jdbc) {
+ if (isBackup && (nodeManagerType == NodeManagerType.Jdbc ||
nodeManagerType == NodeManagerType.File)) {
nodeManager = createNodeManager();
}
return new SameProcessActiveMQServer(createInVMFailoverServer(true,
config, nodeManager, isBackup ? 2 : 1));