Author: baedke Date: Tue Aug 26 15:39:16 2014 New Revision: 1620637 URL: http://svn.apache.org/r1620637 Log: OAK-1915: TarMK failover 2.0
New runmode "syncslave" for oak-run to start a standalone FailoverClient. Modified: jackrabbit/oak/trunk/oak-run/pom.xml jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/run/Main.java Modified: jackrabbit/oak/trunk/oak-run/pom.xml URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/pom.xml?rev=1620637&r1=1620636&r2=1620637&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-run/pom.xml (original) +++ jackrabbit/oak/trunk/oak-run/pom.xml Tue Aug 26 15:39:16 2014 @@ -243,6 +243,11 @@ <version>${project.version}</version> </dependency> <dependency> + <groupId>org.apache.jackrabbit</groupId> + <artifactId>oak-tarmk-failover</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <version>${h2.version}</version> Modified: jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/run/Main.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/run/Main.java?rev=1620637&r1=1620636&r2=1620637&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/run/Main.java (original) +++ jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/run/Main.java Tue Aug 26 15:39:16 2014 @@ -36,16 +36,17 @@ import java.util.Properties; import java.util.Queue; import java.util.Set; import java.util.UUID; +import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.jcr.Repository; import com.google.common.base.Joiner; -import com.google.common.collect.Iterables; import com.google.common.collect.Maps; import com.google.common.collect.Queues; import com.google.common.io.Closer; +import com.google.common.util.concurrent.AbstractScheduledService; import com.mongodb.MongoClient; import com.mongodb.MongoClientURI; import com.mongodb.MongoURI; @@ -75,6 +76,7 @@ import org.apache.jackrabbit.oak.plugins import org.apache.jackrabbit.oak.plugins.segment.SegmentId; import org.apache.jackrabbit.oak.plugins.segment.SegmentNodeState; import org.apache.jackrabbit.oak.plugins.segment.SegmentNodeStore; +import org.apache.jackrabbit.oak.plugins.segment.failover.client.FailoverClient; import org.apache.jackrabbit.oak.plugins.segment.file.FileStore; import org.apache.jackrabbit.oak.scalability.ScalabilityRunner; import org.apache.jackrabbit.oak.spi.state.ChildNodeEntry; @@ -146,6 +148,9 @@ public class Main { case EXPLORE: Explorer.main(args); break; + case SYNCSLAVE: + syncslave(args); + break; case CHECKPOINTS: checkpoints(args); break; @@ -218,6 +223,79 @@ public class Main { } } + //TODO react to state changes of FailoverClient (triggered via JMX), once the state model of FailoverClient is complete. + private static class ScheduledSyncService extends AbstractScheduledService { + + private final FailoverClient failoverClient; + private final int interval; + + public ScheduledSyncService(FailoverClient failoverClient, int interval) { + this.failoverClient = failoverClient; + this.interval = interval; + } + + @Override + public void runOneIteration() throws Exception { + failoverClient.run(); + } + + @Override + protected Scheduler scheduler() { + return Scheduler.newFixedDelaySchedule(0, interval, TimeUnit.SECONDS); + } + } + + private static void syncslave(String[] args) throws Exception { + + final String defaultHost = "127.0.0.1"; + final int defaultPort = 8023; + + final OptionParser parser = new OptionParser(); + final OptionSpec<String> host = parser.accepts("host", "master host").withRequiredArg().ofType(String.class).defaultsTo(defaultHost); + final OptionSpec<Integer> port = parser.accepts("port", "master port").withRequiredArg().ofType(Integer.class).defaultsTo(defaultPort); + final OptionSpec<Integer> interval = parser.accepts("interval", "interval between successive executions").withRequiredArg().ofType(Integer.class); + final OptionSpec help = parser.acceptsAll(asList("h", "?", "help"), "show help").forHelp(); + final OptionSpec<String> nonOption = parser.nonOptions(Mode.SYNCSLAVE + " <path to repository>"); + + final OptionSet options = parser.parse(args); + final List<String> nonOptions = nonOption.values(options); + + if (options.has(help)) { + parser.printHelpOn(System.out); + System.exit(0); + } + + if (nonOptions.isEmpty()) { + parser.printHelpOn(System.err); + System.exit(1); + } + + FileStore store = null; + FailoverClient failoverClient = null; + ScheduledSyncService syncService = null; + try { + store = new FileStore(new File(nonOptions.get(0)), 256); + failoverClient = new FailoverClient( + options.has(host)? options.valueOf(host) : defaultHost, + options.has(port)? options.valueOf(port) : defaultPort, + store); + if (!options.has(interval)) { + failoverClient.run(); + } else { + syncService = new ScheduledSyncService(failoverClient, options.valueOf(interval)); + syncService.startAsync(); + syncService.awaitTerminated(); + } + } finally { + if (store != null) { + store.close(); + } + if (failoverClient != null) { + failoverClient.close(); + } + } + } + public static NodeStore bootstrapNodeStore(String[] args, Closer closer, String h) throws IOException { //TODO add support for other NodeStore flags @@ -811,6 +889,7 @@ public class Main { UPGRADE("upgrade"), SCALABILITY("scalability"), EXPLORE("explore"), + SYNCSLAVE("syncslave"), HELP("help"), CHECKPOINTS("checkpoints");