diff --git a/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/cluster/ClusterNode.java b/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/cluster/ClusterNode.java index 1fdadc95784..f43ac7340d8 100644 --- a/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/cluster/ClusterNode.java +++ b/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/cluster/ClusterNode.java @@ -225,6 +225,7 @@ protected void init() throws ClusterException { clusterNodeId = cc.getId(); syncDelay = cc.getSyncDelay(); stopDelay = cc.getStopDelay(); + disableAutoSync = cc.isDisableAutoSync(); try { journal = cc.getJournal(clusterContext.getNamespaceResolver()); diff --git a/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/config/ClusterConfig.java b/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/config/ClusterConfig.java index 95d8410c120..001bdaf2b08 100644 --- a/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/config/ClusterConfig.java +++ b/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/config/ClusterConfig.java @@ -47,6 +47,11 @@ public class ClusterConfig implements JournalFactory { */ private final JournalFactory jf; + /** + * Disable auto sync + */ + private final boolean disableAutoSync; + /** * Creates a new cluster configuration. * @@ -68,10 +73,26 @@ public ClusterConfig(String id, long syncDelay, JournalFactory jf) { */ public ClusterConfig(String id, long syncDelay, long stopDelay, JournalFactory jf) { + this (id, syncDelay, stopDelay, jf, false); + } + + /** + * Creates a new cluster configuration. + * + * @param id custom cluster node id + * @param syncDelay syncDelay, in milliseconds + * @param stopDelay stopDelay in milliseconds + * @param jf journal factory + * @param disableAutoSync trye if auto sync is disabled + */ + public ClusterConfig(String id, long syncDelay, + long stopDelay, JournalFactory jf, + boolean disableAutoSync) { this.id = id; this.syncDelay = syncDelay; this.stopDelay = stopDelay < 0 ? syncDelay * 10 : stopDelay; this.jf = jf; + this.disableAutoSync = disableAutoSync; } /** @@ -112,4 +133,10 @@ public Journal getJournal(NamespaceResolver resolver) return jf.getJournal(resolver); } + /** + * @return disableAutoSync true if auto sync is disabled + */ + public boolean isDisableAutoSync() { + return disableAutoSync; + } } diff --git a/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/config/RepositoryConfigurationParser.java b/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/config/RepositoryConfigurationParser.java index 6b815e3d580..f5104e23650 100644 --- a/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/config/RepositoryConfigurationParser.java +++ b/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/config/RepositoryConfigurationParser.java @@ -181,6 +181,9 @@ public class RepositoryConfigurationParser extends ConfigurationParser { /** Name of the stopDelay configuration attribute. */ public static final String STOP_DELAY_ATTRIBUTE = "stopDelay"; + /** Name of the disableAutoSync configuration attribute. */ + public static final String DISABLE_AUTO_SYNC_ATTRIBUTE = "disableAutoSync"; + /** Name of the default search index implementation class. */ public static final String DEFAULT_QUERY_HANDLER = "org.apache.jackrabbit.core.query.lucene.SearchIndex"; @@ -895,7 +898,11 @@ protected ClusterConfig parseClusterConfig(Element parent, File home) element, STOP_DELAY_ATTRIBUTE, "-1"))); JournalFactory jf = getJournalFactory(element, home, id); - return new ClusterConfig(id, syncDelay, stopDelay, jf); + + boolean disableAutoSync = Boolean.parseBoolean(replaceVariables(getAttribute( + element, DISABLE_AUTO_SYNC_ATTRIBUTE, "false"))); + + return new ClusterConfig(id, syncDelay, stopDelay, jf, disableAutoSync); } } return null; diff --git a/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/cluster/ClusterSyncTest.java b/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/cluster/ClusterSyncTest.java index 83fbfa8adcd..6ba6dbd7d9b 100644 --- a/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/cluster/ClusterSyncTest.java +++ b/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/cluster/ClusterSyncTest.java @@ -129,6 +129,33 @@ public void run() { assertEquals(master.getRevision(), slave.getRevision()); } + /** + * Verify that a cluster node with sync disabled does not fetch results when changes + * are made. + * + * @throws Exception + */ + public void testSyncDisabled() throws Exception { + // create channel on master and slave + LockEventChannel channel = master.createLockChannel(DEFAULT_WORKSPACE); + channel.setListener(new SimpleEventListener()); + + // add first entry + LockEvent event = new LockEvent(NodeId.randomId(), true, "admin"); + channel.create(event.getNodeId(), event.isDeep(), event.getUserId()).ended(true); + + // do not sync slave + + // add second entry + event = new LockEvent(NodeId.randomId(), true, "admin"); + channel.create(event.getNodeId(), event.isDeep(), event.getUserId()).ended(true); + + long masterRevision = master.getRevision(); + long slaveRevision = slave.getRevision(); + + assertTrue(masterRevision > slaveRevision); + } + /** * Create a cluster node, with a memory journal referencing a list of records. *