Improve Jackrabbit clustering
authormbaudier <mbaudier@mostar>
Mon, 6 Nov 2017 10:19:29 +0000 (11:19 +0100)
committermbaudier <mbaudier@mostar>
Mon, 6 Nov 2017 10:19:29 +0000 (11:19 +0100)
demo/argeo_node_cluster_0.properties
demo/argeo_node_cluster_1.properties
org.argeo.cms/src/org/argeo/cms/internal/jcr/JackrabbitType.java
org.argeo.cms/src/org/argeo/cms/internal/jcr/RepositoryBuilder.java
org.argeo.cms/src/org/argeo/cms/internal/jcr/repository-postgresql_cluster_ds.xml [new file with mode: 0644]

index 1a696fa36a9612cd2295139983fc9004aca25278..2b25750352c1f1bcaf03748d5fa78d7188ed9f03 100644 (file)
@@ -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
index 8044cf4276320f5c1e0f7aee514f9900f0ae7ef9..2d35be9dd347b99def350e9cbf3b26a5f130721b 100644 (file)
@@ -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
index 9b07b59e8e5dde4ca27594f6011832032feae0ef..cbb7930166848ba690f9de0a6368bd1ba352efbc 100644 (file)
@@ -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;
 }
index ca5dfccb836924e33013c6913fe235cbcda2132d..622600d3ce6ba6fe5f34198247ed850eb349e30c 100644 (file)
@@ -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 (file)
index 0000000..ff181f1
--- /dev/null
@@ -0,0 +1,90 @@
+<?xml version="1.0"?>
+<!DOCTYPE Repository PUBLIC "Jackrabbit 2.6" "http://jackrabbit.apache.org/dtd/repository-2.6.dtd">
+<Repository>
+       <!-- Shared datasource -->
+       <DataSources>
+               <DataSource name="dataSource">
+                       <param name="driver" value="org.postgresql.Driver" />
+                       <param name="url" value="${dburl}" />
+                       <param name="user" value="${dbuser}" />
+                       <param name="password" value="${dbpassword}" />
+                       <param name="databaseType" value="postgresql" />
+                       <param name="maxPoolSize" value="${maxPoolSize}" />
+               </DataSource>
+       </DataSources>
+
+       <!-- File system and datastore -->
+       <FileSystem class="org.apache.jackrabbit.core.fs.db.DbFileSystem">
+               <param name="dataSourceName" value="dataSource" />
+               <param name="schema" value="postgresql" />
+               <param name="schemaObjectPrefix" value="fs_" />
+       </FileSystem>
+       <DataStore class="org.apache.jackrabbit.core.data.FileDataStore">
+               <param name="path" value="${rep.home}/../datastore" />
+       </DataStore>
+
+       <!-- Workspace templates -->
+       <Workspaces rootPath="${rep.home}/workspaces"
+               defaultWorkspace="${defaultWorkspace}" />
+       <Workspace name="${wsp.name}">
+               <FileSystem class="org.apache.jackrabbit.core.fs.db.DbFileSystem">
+                       <param name="dataSourceName" value="dataSource" />
+                       <param name="schema" value="postgresql" />
+                       <param name="schemaObjectPrefix" value="${wsp.name}_fs_" />
+               </FileSystem>
+               <PersistenceManager
+                       class="org.apache.jackrabbit.core.persistence.pool.PostgreSQLPersistenceManager">
+                       <param name="dataSourceName" value="dataSource" />
+                       <param name="schemaObjectPrefix" value="${wsp.name}_pm_" />
+                       <param name="bundleCacheSize" value="${bundleCacheMB}" />
+               </PersistenceManager>
+               <SearchIndex class="org.apache.jackrabbit.core.query.lucene.SearchIndex">
+                       <param name="path" value="${indexesBase}/${cn}/${wsp.name}/index" />
+                       <param name="extractorPoolSize" value="${extractorPoolSize}" />
+                       <param name="cacheSize" value="${searchCacheSize}" />
+                       <param name="maxVolatileIndexSize" value="${maxVolatileIndexSize}" />
+               </SearchIndex>
+               <WorkspaceSecurity>
+                       <AccessControlProvider
+                               class="org.argeo.security.jackrabbit.ArgeoAccessControlProvider" />
+               </WorkspaceSecurity>
+       </Workspace>
+
+       <!-- Versioning -->
+       <Versioning rootPath="${rep.home}/version">
+               <FileSystem class="org.apache.jackrabbit.core.fs.db.DbFileSystem">
+                       <param name="dataSourceName" value="dataSource" />
+                       <param name="schema" value="postgresql" />
+                       <param name="schemaObjectPrefix" value="fs_ver_" />
+               </FileSystem>
+               <PersistenceManager
+                       class="org.apache.jackrabbit.core.persistence.pool.PostgreSQLPersistenceManager">
+                       <param name="dataSourceName" value="dataSource" />
+                       <param name="schemaObjectPrefix" value="pm_ver_" />
+                       <param name="bundleCacheSize" value="${bundleCacheMB}" />
+               </PersistenceManager>
+       </Versioning>
+
+       <!-- Indexing -->
+       <SearchIndex class="org.apache.jackrabbit.core.query.lucene.SearchIndex">
+               <param name="path" value="${indexesBase}/${cn}/index" />
+               <param name="extractorPoolSize" value="${extractorPoolSize}" />
+               <param name="cacheSize" value="${searchCacheSize}" />
+               <param name="maxVolatileIndexSize" value="${maxVolatileIndexSize}" />
+       </SearchIndex>
+
+       <!-- Security -->
+       <Security appName="Jackrabbit">
+               <SecurityManager class="org.argeo.security.jackrabbit.ArgeoSecurityManager"
+                       workspaceName="security" />
+               <AccessManager class="org.argeo.security.jackrabbit.ArgeoAccessManager" />
+       </Security>
+
+       <!-- Clustering -->
+       <Cluster id="${clusterId}">
+               <Journal class="org.apache.jackrabbit.core.journal.DatabaseJournal">
+                       <param name="dataSourceName" value="dataSource" />
+                       <param name="schemaObjectPrefix" value="journal_" />
+               </Journal>
+       </Cluster>
+</Repository>
\ No newline at end of file