Author: reschke Date: Mon Mar 18 15:57:04 2019 New Revision: 1855776 URL: http://svn.apache.org/viewvc?rev=1855776&view=rev Log: OAK-8111: Create read-only DocumentNodeStore for oak-run recovery dry run
Modified: jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/run/RecoveryCommand.java jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/run/Utils.java Modified: jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/run/RecoveryCommand.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/run/RecoveryCommand.java?rev=1855776&r1=1855775&r2=1855776&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/run/RecoveryCommand.java (original) +++ jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/run/RecoveryCommand.java Mon Mar 18 15:57:04 2019 @@ -19,8 +19,11 @@ package org.apache.jackrabbit.oak.run; import java.io.Closeable; import java.util.Arrays; +import java.util.List; +import org.apache.jackrabbit.oak.plugins.document.ClusterNodeInfoDocument; import org.apache.jackrabbit.oak.plugins.document.DocumentNodeStore; +import org.apache.jackrabbit.oak.plugins.document.DocumentNodeStoreBuilder; import org.apache.jackrabbit.oak.plugins.document.DocumentStore; import org.apache.jackrabbit.oak.plugins.document.LastRevRecoveryAgent; import org.apache.jackrabbit.oak.plugins.document.MissingLastRevSeeker; @@ -43,16 +46,26 @@ class RecoveryCommand implements Command MapFactory.setInstance(new MapDBMapFactory()); Closer closer = Closer.create(); String h = "recovery mongodb://host:port/database|jdbc:... { dryRun }"; + try { - NodeStore store = Utils.bootstrapNodeStore(args, closer, h); + DocumentNodeStoreBuilder<?> builder = Utils.createDocumentMKBuilder(args, closer, h); - if (!(store instanceof DocumentNodeStore)) { - System.err.println("Recovery only available for DocumentNodeStore"); + if (builder == null) { + System.err.println("Recovery only available for DocumentNodeStore backed by MongoDB or RDB persistence"); System.exit(1); } - DocumentNodeStore dns = (DocumentNodeStore) store; - DocumentStore ds = dns.getDocumentStore(); + // dryRun implies readonly repo + boolean dryRun = Arrays.asList(args).contains("dryRun"); + if (dryRun) { + builder.setReadOnlyMode(); + } + + DocumentNodeStore dns = builder.build(); + closer.register(Utils.asCloseable(dns)); + + DocumentStore ds = builder.getDocumentStore(); + LastRevRecoveryAgent agent = null; MissingLastRevSeeker seeker = null; @@ -72,12 +85,30 @@ class RecoveryCommand implements Command System.exit(1); } + if (builder.getClusterId() == 0) { + System.err.println("Please specify the clusterId for recovery using --clusterId"); + try { + List<ClusterNodeInfoDocument> all = ClusterNodeInfoDocument.all(ds); + System.err.println("Existing entries in the clusternodes collection are:"); + for (ClusterNodeInfoDocument c : all) { + String state = c.isActive() ? "ACTIVE" : "INACTIVE"; + System.err.println(c.getClusterId() + + " (" + state + "): " + + c.toString().replace('\n', ' ')); + } + } + catch (Throwable e) { + e.printStackTrace(System.err); + } + System.exit(1); + } + Iterable<NodeDocument> docs = seeker.getCandidates(0); if (docs instanceof Closeable) { closer.register((Closeable) docs); } - boolean dryRun = Arrays.asList(args).contains("dryRun"); - agent.recover(docs, dns.getClusterId(), dryRun); + + agent.recover(docs, builder.getClusterId(), dryRun); } catch (Throwable e) { throw closer.rethrow(e); } finally { Modified: jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/run/Utils.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/run/Utils.java?rev=1855776&r1=1855775&r2=1855776&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/run/Utils.java (original) +++ jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/run/Utils.java Mon Mar 18 15:57:04 2019 @@ -181,6 +181,11 @@ class Utils { } @Nullable + static DocumentNodeStoreBuilder<?> createDocumentMKBuilder(String[] args, Closer closer, String h) throws IOException { + return createDocumentMKBuilder(new NodeStoreOptions(h).parse(args), closer); + } + + @Nullable static DocumentNodeStoreBuilder<?> createDocumentMKBuilder(NodeStoreOptions options, Closer closer) throws IOException {