Author: chetanm
Date: Wed May 17 06:40:35 2017
New Revision: 1795401

URL: http://svn.apache.org/viewvc?rev=1795401&view=rev
Log:
OAK-6228 - Enable index consistency check via oak-run

Consistency check is now supported via --index-consistency-check option

Added:
    
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/IndexConsistencyCheckPrinter.java
   (with props)
Modified:
    
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/IndexCommand.java
    
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/IndexHelper.java
    
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/IndexOptions.java
    
jackrabbit/oak/trunk/oak-run/src/test/java/org/apache/jackrabbit/oak/index/IndexCommandIT.java

Modified: 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/IndexCommand.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/IndexCommand.java?rev=1795401&r1=1795400&r2=1795401&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/IndexCommand.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/IndexCommand.java
 Wed May 17 06:40:35 2017
@@ -35,8 +35,10 @@ public class IndexCommand implements Com
 
     public static final String INDEX_DEFINITIONS_JSON = 
"index-definitions.json";
     public static final String INDEX_INFO_TXT = "index-info.txt";
+    public static final String INDEX_CONSISTENCY_CHECK_TXT = 
"index-consistency-check-report.txt";
     private File info;
     private File definitions;
+    private File consistencyCheckReport;
 
     @Override
     public void execute(String... args) throws Exception {
@@ -63,6 +65,10 @@ public class IndexCommand implements Com
         if (definitions != null) {
             System.out.printf("Index definitions stored at %s%n", 
getPath(definitions));
         }
+
+        if (consistencyCheckReport != null) {
+            System.out.printf("Index consistency check report stored at %s%n", 
getPath(consistencyCheckReport));
+        }
     }
 
     private void execute(NodeStore store, IndexOptions indexOpts) throws 
IOException {
@@ -71,6 +77,18 @@ public class IndexCommand implements Com
 
         dumpIndexStats(indexOpts, indexHelper);
         dumpIndexDefinitions(indexOpts, indexHelper);
+        performConsistencyCheck(indexOpts, indexHelper);
+    }
+
+    private void performConsistencyCheck(IndexOptions indexOpts, IndexHelper 
indexHelper) throws IOException {
+        if (indexOpts.checkConsistency()) {
+            IndexConsistencyCheckPrinter printer =
+                    new IndexConsistencyCheckPrinter(indexHelper, 
indexOpts.consistencyCheckLevel());
+            PrinterDumper dumper = new 
PrinterDumper(indexHelper.getOutputDir(), INDEX_CONSISTENCY_CHECK_TXT,
+                    false, Format.TEXT, printer);
+            dumper.dump();
+            consistencyCheckReport = dumper.getOutFile();
+        }
     }
 
     private void dumpIndexDefinitions(IndexOptions indexOpts, IndexHelper 
indexHelper) throws IOException {

Added: 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/IndexConsistencyCheckPrinter.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/IndexConsistencyCheckPrinter.java?rev=1795401&view=auto
==============================================================================
--- 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/IndexConsistencyCheckPrinter.java
 (added)
+++ 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/IndexConsistencyCheckPrinter.java
 Wed May 17 06:40:35 2017
@@ -0,0 +1,92 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.jackrabbit.oak.index;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.List;
+
+import com.google.common.base.Stopwatch;
+import org.apache.felix.inventory.Format;
+import org.apache.felix.inventory.InventoryPrinter;
+import 
org.apache.jackrabbit.oak.plugins.index.lucene.directory.IndexConsistencyChecker;
+import 
org.apache.jackrabbit.oak.plugins.index.lucene.directory.IndexConsistencyChecker.Level;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
+import org.apache.jackrabbit.oak.spi.state.NodeStateUtils;
+
+import static 
org.apache.jackrabbit.oak.plugins.index.IndexConstants.TYPE_PROPERTY_NAME;
+import static 
org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexConstants.TYPE_LUCENE;
+
+class IndexConsistencyCheckPrinter implements InventoryPrinter {
+    private final IndexHelper indexHelper;
+    private final Level level;
+
+    public IndexConsistencyCheckPrinter(IndexHelper indexHelper, int level) {
+        this.indexHelper = indexHelper;
+        this.level = level == 1 ? Level.BLOBS_ONLY : Level.FULL;
+    }
+
+    @Override
+    public void print(PrintWriter pw, Format format, boolean isZip) {
+        Stopwatch watch = Stopwatch.createStarted();
+        NodeState root = indexHelper.getNodeStore().getRoot();
+
+        List<String> validIndexes = new ArrayList<>();
+        List<String> invalidIndexes = new ArrayList<>();
+        List<String> ignoredIndexes = new ArrayList<>();
+
+        for (String indexPath : 
indexHelper.getIndexPathService().getIndexPaths()) {
+            NodeState indexState = NodeStateUtils.getNode(root, indexPath);
+            if (!TYPE_LUCENE.equals(indexState.getString(TYPE_PROPERTY_NAME))){
+                ignoredIndexes.add(indexPath);
+                continue;
+            }
+
+            IndexConsistencyChecker checker = new 
IndexConsistencyChecker(root, indexPath, indexHelper.getWorkDir());
+            try {
+                IndexConsistencyChecker.Result result = checker.check(level);
+                result.dump(pw);
+                if (result.clean) {
+                    validIndexes.add(indexPath);
+                } else {
+                    invalidIndexes.add(indexPath);
+                }
+                System.out.printf("%s => %s%n", indexPath, result.clean ? 
"valid" : "invalid <==");
+            } catch (IOException e) {
+                pw.printf("Error occurred while performing consistency check 
for index [%s]%n", indexPath);
+                e.printStackTrace(pw);
+            }
+            pw.println();
+        }
+
+        print(validIndexes, "Valid indexes :", pw);
+        print(invalidIndexes, "Invalid indexes :", pw);
+        print(ignoredIndexes, "Ignored indexes as these are not of type 
lucene:", pw);
+        pw.printf("Time taken %s%n", watch);
+    }
+
+    private static void print(List<String> indexPaths, String message, 
PrintWriter pw) {
+        if (!indexPaths.isEmpty()) {
+            pw.println(message);
+            indexPaths.forEach((path) -> pw.printf("    - %s%n", path));
+        }
+    }
+}

Propchange: 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/IndexConsistencyCheckPrinter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/IndexHelper.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/IndexHelper.java?rev=1795401&r1=1795400&r2=1795401&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/IndexHelper.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/IndexHelper.java
 Wed May 17 06:40:35 2017
@@ -50,10 +50,18 @@ class IndexHelper {
         this.indexPaths = indexPaths;
     }
 
+    public NodeStore getNodeStore() {
+        return store;
+    }
+
     public File getOutputDir() {
         return outputDir;
     }
 
+    public File getWorkDir() {
+        return workDir;
+    }
+
     public IndexPrinter getIndexPrinter() {
         return new IndexPrinter(getIndexInfoService(), 
getAsyncIndexInfoService());
     }
@@ -62,7 +70,7 @@ class IndexHelper {
         return new IndexDefinitionPrinter(store, getIndexPathService());
     }
 
-    private IndexPathService getIndexPathService() {
+    public IndexPathService getIndexPathService() {
         if (indexPathService == null) {
             if (indexPaths.isEmpty()) {
                 indexPathService = new IndexPathServiceImpl(store);

Modified: 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/IndexOptions.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/IndexOptions.java?rev=1795401&r1=1795400&r2=1795401&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/IndexOptions.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/index/IndexOptions.java
 Wed May 17 06:40:35 2017
@@ -49,6 +49,7 @@ public class IndexOptions implements Opt
     private final OptionSpec<File> outputDirOpt;
     private final OptionSpec<Void> stats;
     private final OptionSpec<Void> definitions;
+    private final OptionSpec<Integer> consistencyCheck;
     private OptionSet options;
     private final Set<OptionSpec> actionOpts;
     private final OptionSpec<String> indexPaths;
@@ -65,8 +66,13 @@ public class IndexOptions implements Opt
                 "selected operations need to be performed")
                 
.withRequiredArg().ofType(String.class).withValuesSeparatedBy(",");
 
+        consistencyCheck = parser.accepts("index-consistency-check", "Performs 
consistency check " +
+                "for indexes as specified by --index-paths. If none specified 
performs check for all indexes. Currently " +
+                "this is only supported for Lucene indexes. Possible values 1 
- Basic check, 2 - Full check (slower)")
+                .withOptionalArg().ofType(Integer.class).defaultsTo(1);
+
         //Set of options which define action
-        actionOpts = ImmutableSet.of(stats, definitions);
+        actionOpts = ImmutableSet.of(stats, definitions, consistencyCheck);
     }
 
     @Override
@@ -92,6 +98,14 @@ public class IndexOptions implements Opt
         return options.has(definitions) || !anyActionSelected();
     }
 
+    public boolean checkConsistency(){
+        return options.has(consistencyCheck);
+    }
+
+    public int consistencyCheckLevel(){
+        return consistencyCheck.value(options);
+    }
+
     public List<String> getIndexPaths(){
         return options.has(indexPaths) ? trim(indexPaths.values(options)) : 
Collections.emptyList();
     }

Modified: 
jackrabbit/oak/trunk/oak-run/src/test/java/org/apache/jackrabbit/oak/index/IndexCommandIT.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/test/java/org/apache/jackrabbit/oak/index/IndexCommandIT.java?rev=1795401&r1=1795400&r2=1795401&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-run/src/test/java/org/apache/jackrabbit/oak/index/IndexCommandIT.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-run/src/test/java/org/apache/jackrabbit/oak/index/IndexCommandIT.java
 Wed May 17 06:40:35 2017
@@ -39,6 +39,7 @@ import static java.nio.charset.Charset.d
 import static org.apache.jackrabbit.commons.JcrUtils.getOrCreateByPath;
 import static org.hamcrest.CoreMatchers.containsString;
 import static org.hamcrest.CoreMatchers.not;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
 
@@ -112,6 +113,34 @@ public class IndexCommandIT {
         assertThat(Files.toString(info, defaultCharset()), 
containsString("/oak:index/fooIndex"));
     }
 
+    @Test
+    public void consistencyCheck() throws Exception{
+        createTestData();
+        //Close the repository so as all changes are flushed
+        fixture.close();
+
+        IndexCommand command = new IndexCommand();
+
+        File outDir = temporaryFolder.newFolder();
+        String[] args = {
+                "--index-work-dir=" + 
temporaryFolder.newFolder().getAbsolutePath(),
+                "--index-out-dir="  + outDir.getAbsolutePath(),
+                "--index-consistency-check",
+                "--", // -- indicates that options have ended and rest needs 
to be treated as non option
+                fixture.getDir().getAbsolutePath()
+        };
+
+        command.execute(args);
+
+        File report = new File(outDir, 
IndexCommand.INDEX_CONSISTENCY_CHECK_TXT);
+
+        assertFalse(new File(outDir, IndexCommand.INDEX_INFO_TXT).exists());
+        assertFalse(new File(outDir, 
IndexCommand.INDEX_DEFINITIONS_JSON).exists());
+        assertTrue(report.exists());
+
+        assertThat(Files.toString(report, defaultCharset()), 
containsString("/oak:index/fooIndex"));
+    }
+
     private void createTestData() throws IOException, RepositoryException {
         fixture = new RepositoryFixture(temporaryFolder.newFolder());
         indexIndexDefinitions();


Reply via email to