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 {


Reply via email to