From: mbaudier Date: Mon, 6 Nov 2017 10:19:29 +0000 (+0100) Subject: Improve Jackrabbit clustering X-Git-Tag: argeo-commons-2.1.70~41 X-Git-Url: https://git.argeo.org/?p=lgpl%2Fargeo-commons.git;a=commitdiff_plain;h=914f28bff086f27218c7e657428fd68fa44b0d15 Improve Jackrabbit clustering --- diff --git a/demo/argeo_node_cluster_0.properties b/demo/argeo_node_cluster_0.properties index 1a696fa36..2b2575035 100644 --- a/demo/argeo_node_cluster_0.properties +++ b/demo/argeo_node_cluster_0.properties @@ -17,7 +17,7 @@ org.eclipse.equinox.http.registry,\ java.security.manager= java.security.policy=file:../../all.policy -argeo.node.repo.type=postgresql_cluster +argeo.node.repo.type=postgresql_cluster_ds argeo.node.repo.clusterId=03233754-16c3-49a1-8a00-58bf89a65182 argeo.node.repo.dburl=jdbc:postgresql://localhost/argeo_node_cluster argeo.node.repo.dbuser=argeo diff --git a/demo/argeo_node_cluster_1.properties b/demo/argeo_node_cluster_1.properties index 8044cf427..2d35be9dd 100644 --- a/demo/argeo_node_cluster_1.properties +++ b/demo/argeo_node_cluster_1.properties @@ -17,7 +17,7 @@ org.eclipse.equinox.http.registry,\ java.security.manager= java.security.policy=file:../../all.policy -argeo.node.repo.type=postgresql_cluster +argeo.node.repo.type=postgresql_cluster_ds argeo.node.repo.clusterId=52463fa3-2917-4814-9ff7-685c41cbc7c7 argeo.node.repo.dburl=jdbc:postgresql://localhost/argeo_node_cluster argeo.node.repo.dbuser=argeo diff --git a/org.argeo.cms/src/org/argeo/cms/internal/jcr/JackrabbitType.java b/org.argeo.cms/src/org/argeo/cms/internal/jcr/JackrabbitType.java index 9b07b59e8..cbb793016 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/jcr/JackrabbitType.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/jcr/JackrabbitType.java @@ -1,6 +1,19 @@ package org.argeo.cms.internal.jcr; -/** The available Jackrabbit node types */ +/** Pre-defined Jackrabbit repository configurations. */ enum JackrabbitType { - localfs, h2, postgresql, postgresql_ds, postgresql_cluster, memory; + /** Local file system */ + localfs, + /** Embedded Java H2 database */ + h2, + /** PostgreSQL */ + postgresql, + /** PostgreSQL with datastore */ + postgresql_ds, + /** PostgreSQL with cluster */ + postgresql_cluster, + /** PostgreSQL with cluster and datastore */ + postgresql_cluster_ds, + /** Memory */ + memory; } diff --git a/org.argeo.cms/src/org/argeo/cms/internal/jcr/RepositoryBuilder.java b/org.argeo.cms/src/org/argeo/cms/internal/jcr/RepositoryBuilder.java index ca5dfccb8..622600d3c 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/jcr/RepositoryBuilder.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/jcr/RepositoryBuilder.java @@ -1,6 +1,5 @@ package org.argeo.cms.internal.jcr; -import java.io.File; import java.io.IOException; import java.io.InputStream; import java.net.URI; @@ -76,13 +75,30 @@ public class RepositoryBuilder { props.put(key, properties.get(key)); } + // cluster id + // cf. https://wiki.apache.org/jackrabbit/Clustering + // TODO deal with multiple repos + String clusterId = System.getProperty("org.apache.jackrabbit.core.cluster.node_id"); + String clusterIdProp = props.getProperty(RepoConf.clusterId.name()); + if (clusterId != null) { + if (clusterIdProp != null) + throw new CmsException("Cluster id defined as System properties and in deploy config"); + props.put(RepoConf.clusterId.name(), clusterId); + } else { + clusterId = clusterIdProp; + } + // home String homeUri = props.getProperty(RepoConf.labeledUri.name()); Path homePath; if (homeUri == null) { String cn = props.getProperty(NodeConstants.CN); assert cn != null; - homePath = CmsPaths.getRepoDirPath(cn); + if (clusterId != null) { + homePath = CmsPaths.getRepoDirPath(cn + '/' + clusterId); + } else { + homePath = CmsPaths.getRepoDirPath(cn); + } } else { try { homePath = Paths.get(new URI(homeUri)).toAbsolutePath(); @@ -90,17 +106,18 @@ public class RepositoryBuilder { throw new CmsException("Invalid repository home URI", e); } } + // TODO use Jackrabbit API (?) Path rootUuidPath = homePath.resolve("repository/meta/rootUUID"); - if (!Files.exists(rootUuidPath)) { - try { + try { + if (!Files.exists(rootUuidPath)) { Files.createDirectories(rootUuidPath.getParent()); Files.write(rootUuidPath, UUID.randomUUID().toString().getBytes()); - } catch (IOException e) { - log.error("Could not set rootUUID", e); } + // File homeDir = homePath.toFile(); + // homeDir.mkdirs(); + } catch (IOException e) { + throw new CmsException("Cannot set up repository home " + homePath, e); } - File homeDir = homePath.toFile(); - homeDir.mkdirs(); // home cannot be overridden props.put(RepositoryConfigurationParser.REPOSITORY_HOME_VARIABLE, homePath.toString()); @@ -119,7 +136,7 @@ public class RepositoryBuilder { String dburl; switch (type) { case h2: - dburl = "jdbc:h2:" + homeDir.getPath() + "/h2/repository"; + dburl = "jdbc:h2:" + homePath.toAbsolutePath() + "/h2/repository"; setProp(props, RepoConf.dburl, dburl); setProp(props, RepoConf.dbuser, "sa"); setProp(props, RepoConf.dbpassword, ""); @@ -127,6 +144,7 @@ public class RepositoryBuilder { case postgresql: case postgresql_ds: case postgresql_cluster: + case postgresql_cluster_ds: dburl = "jdbc:postgresql://localhost/demo"; setProp(props, RepoConf.dburl, dburl); setProp(props, RepoConf.dbuser, "argeo"); diff --git a/org.argeo.cms/src/org/argeo/cms/internal/jcr/repository-postgresql_cluster_ds.xml b/org.argeo.cms/src/org/argeo/cms/internal/jcr/repository-postgresql_cluster_ds.xml new file mode 100644 index 000000000..ff181f195 --- /dev/null +++ b/org.argeo.cms/src/org/argeo/cms/internal/jcr/repository-postgresql_cluster_ds.xml @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file