You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by al...@apache.org on 2014/07/03 22:33:41 UTC
svn commit: r1607743 - in /jackrabbit/oak/trunk/oak-run: README.md
src/main/java/org/apache/jackrabbit/oak/run/Main.java
Author: alexparvulescu
Date: Thu Jul 3 20:33:41 2014
New Revision: 1607743
URL: http://svn.apache.org/r1607743
Log:
OAK-1947 Make backup and restore options generic
Modified:
jackrabbit/oak/trunk/oak-run/README.md
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/run/Main.java
Modified: jackrabbit/oak/trunk/oak-run/README.md
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/README.md?rev=1607743&r1=1607742&r2=1607743&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-run/README.md (original)
+++ jackrabbit/oak/trunk/oak-run/README.md Thu Jul 3 20:33:41 2014
@@ -19,14 +19,16 @@ Backup
The 'backup' mode creates a backup from an existing oak repository. To start this mode, use:
- $ java -jar oak-run-*.jar backup /path/to/repository /path/to/backup
+ $ java -jar oak-run-*.jar backup \
+ { /path/to/oak/repository | mongodb://host:port/database } /path/to/backup
Restore
-------
The 'restore' mode imports a backup of an existing oak repository. To start this mode, use:
- $ java -jar oak-run-*.jar restore /path/to/repository /path/to/backup
+ $ java -jar oak-run-*.jar restore \
+ { /path/to/oak/repository | mongodb://host:port/database } /path/to/backup
Debug
-----
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=1607743&r1=1607742&r2=1607743&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 Thu Jul 3 20:33:41 2014
@@ -16,6 +16,7 @@
*/
package org.apache.jackrabbit.oak.run;
+import java.io.Closeable;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
@@ -36,8 +37,10 @@ import javax.jcr.Repository;
import com.google.common.collect.Maps;
import com.google.common.collect.Queues;
+import com.google.common.io.Closer;
import com.mongodb.MongoClient;
import com.mongodb.MongoClientURI;
+import com.mongodb.MongoURI;
import joptsimple.OptionParser;
import joptsimple.OptionSet;
@@ -46,7 +49,6 @@ import joptsimple.OptionSpec;
import org.apache.jackrabbit.core.RepositoryContext;
import org.apache.jackrabbit.core.config.RepositoryConfig;
import org.apache.jackrabbit.oak.Oak;
-import org.apache.jackrabbit.oak.api.CommitFailedException;
import org.apache.jackrabbit.oak.api.ContentRepository;
import org.apache.jackrabbit.oak.benchmark.BenchmarkRunner;
import org.apache.jackrabbit.oak.commons.PathUtils;
@@ -61,6 +63,7 @@ import org.apache.jackrabbit.oak.plugins
import org.apache.jackrabbit.oak.plugins.backup.FileStoreRestore;
import org.apache.jackrabbit.oak.plugins.document.DocumentMK;
import org.apache.jackrabbit.oak.plugins.document.DocumentNodeStore;
+import org.apache.jackrabbit.oak.plugins.document.util.MongoConnection;
import org.apache.jackrabbit.oak.plugins.segment.RecordId;
import org.apache.jackrabbit.oak.plugins.segment.Segment;
import org.apache.jackrabbit.oak.plugins.segment.SegmentId;
@@ -175,34 +178,108 @@ public class Main {
}
private static void backup(String[] args) throws IOException {
- if (args.length == 2) {
- // TODO: enable backup for other node store implementations
- FileStore store = new FileStore(new File(args[0]), 256, false);
- FileStoreBackup.backup(new SegmentNodeStore(store), new File(args[1]));
- store.close();
- } else {
- System.err.println("usage: backup <repository> <backup>");
- System.exit(1);
+ Closer closer = Closer.create();
+ String h = "backup { /path/to/oak/repository | mongodb://host:port/database } <path/to/backup>";
+ try {
+ NodeStore store = bootstrapNodeStore(args, closer, h);
+ FileStoreBackup.backup(store, new File(args[1]));
+ } catch (Throwable e) {
+ throw closer.rethrow(e);
+ } finally {
+ closer.close();
}
}
private static void restore(String[] args) throws IOException {
- if (args.length == 2) {
- // TODO: enable restore for other node store implementations
- FileStore store = new FileStore(new File(args[0]), 256, false);
- File target = new File(args[1]);
- try {
- FileStoreRestore.restore(target, new SegmentNodeStore(store));
- } catch (CommitFailedException e) {
- throw new IOException(e);
+ Closer closer = Closer.create();
+ String h = "restore { /path/to/oak/repository | mongodb://host:port/database } <path/to/backup>";
+ try {
+ NodeStore store = bootstrapNodeStore(args, closer, h);
+ FileStoreRestore.restore(new File(args[1]), store);
+ } catch (Throwable e) {
+ throw closer.rethrow(e);
+ } finally {
+ closer.close();
+ }
+ }
+
+ public static NodeStore bootstrapNodeStore(String[] args, Closer closer,
+ String h) throws IOException {
+ //TODO add support for other NodeStore flags
+ OptionParser parser = new OptionParser();
+ OptionSpec<Integer> clusterId = parser
+ .accepts("clusterId", "MongoMK clusterId").withRequiredArg()
+ .ofType(Integer.class).defaultsTo(1);
+ OptionSpec<?> help = parser.acceptsAll(asList("h", "?", "help"),
+ "show help").forHelp();
+ OptionSpec<String> nonOption = parser
+ .nonOptions(h);
+
+ OptionSet options = parser.parse(args);
+ 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);
+ }
+
+ String src = nonOptions.get(0);
+ if (src.startsWith(MongoURI.MONGODB_PREFIX)) {
+ MongoClientURI uri = new MongoClientURI(src);
+ if (uri.getDatabase() == null) {
+ System.err.println("Database missing in MongoDB URI: "
+ + uri.getURI());
+ System.exit(1);
}
- store.close();
+ MongoConnection mongo = new MongoConnection(uri.getURI());
+ closer.register(asCloseable(mongo));
+ DocumentNodeStore store = new DocumentMK.Builder()
+ .setMongoDB(mongo.getDB())
+ .setClusterId(clusterId.value(options)).getNodeStore();
+ closer.register(asCloseable(store));
+ return store;
} else {
- System.err.println("usage: restore <repository> <backup>");
- System.exit(1);
+ FileStore fs = new FileStore(new File(src), 256, false);
+ closer.register(asCloseable(fs));
+ return new SegmentNodeStore(fs);
}
}
+ private static Closeable asCloseable(final FileStore fs) {
+ return new Closeable() {
+
+ @Override
+ public void close() throws IOException {
+ fs.close();
+ }
+ };
+ }
+
+ private static Closeable asCloseable(final DocumentNodeStore dns) {
+ return new Closeable() {
+
+ @Override
+ public void close() throws IOException {
+ dns.dispose();
+ }
+ };
+ }
+
+ private static Closeable asCloseable(final MongoConnection con) {
+ return new Closeable() {
+
+ @Override
+ public void close() throws IOException {
+ con.close();
+ }
+ };
+ }
+
private static void compact(String[] args) throws IOException {
if (args.length != 1) {
System.err.println("usage: compact <path>");