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();